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()); 
Edward Tanguay
sumber
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

Cédric Rup
sumber
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();
Guffa
sumber
5

Karena p.Trim () mengembalikan string baru.

Anda perlu menggunakan:

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

Atau coba ini:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Lawrence Phillips
sumber
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();
    }
LawMan
sumber
2

coba gunakan Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
pengguna2826608
sumber
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;
}
foxjazzHack
sumber
-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

Hung Vu
sumber