Bagaimana saya bisa membagi dan memotong string menjadi beberapa bagian dalam satu baris?


124

Saya ingin membagi baris ini:

string line = "First Name ; string ; firstName";

ke dalam serangkaian versi yang dipangkas:

"First Name"
"string"
"firstName"

Bagaimana saya bisa melakukan ini semua dalam satu baris? Yang berikut memberi saya kesalahan "tidak dapat mengubah tipe void":

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 

2
Kesalahan dikembalikan karena ForEachbekerja pada contoh saat ini IEnumerabledan kembali void.
Majkel

Jawaban:


291

Mencoba

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

FYI, metode Foreach mengambil sebuah Action (mengambil T dan mengembalikan void) untuk parameter, dan lambda Anda mengembalikan sebuah string sebagai string. Trim mengembalikan sebuah string

Metode ekstensi Foreach dimaksudkan untuk mengubah keadaan objek dalam koleksi. Karena string tidak dapat diubah, ini tidak akan berpengaruh

Semoga membantu; o)

Cédric


3
Catatan: ForEachbukan merupakan metode ekstensi.
Guffa

Solusi terbaik di Linq!
Sonhja

Bagaimana jika tidak ada nilai apakah itu mengembalikan nol?
Demodave

jika baris null maka Anda mendapatkan pengecualian. jika baris tidak mengandung ';' Anda akan memiliki daftar dengan satu string yang sesuai dengan garis trimmid
Cédric Rup

22

The ForEachmetode tidak kembali apa-apa, sehingga Anda tidak dapat menetapkan bahwa untuk variabel.

Gunakan Selectmetode ekstensi sebagai gantinya:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

5

Karena p.Trim () mengembalikan string baru.

Anda perlu menggunakan:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

3

Atau coba ini:

string[] parts = Regex.Split(line, "\\s*;\\s*");

Ini adalah ide yang bagus, namun, saya yakin tidak ada tanda kosong di akhir string, benar?
jrichview

3

Berikut metode ekstensi ...

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }

2

coba gunakan Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();

0

Split mengembalikan tipe string []. Tulis metode ekstensi:

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

Saya menyukai solusi Anda, jadi saya memutuskan untuk menambahkannya dan membuatnya lebih bermanfaat.

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}

-1

Gunakan Regex

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

Hasil:

bob

jon

pria

francis

luke

lee

bob

Jelaskan pola [,; \ s]: Cocokkan satu kemunculan baik dari,; atau karakter spasi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.