Bir dizgiyi tek bir satırda nasıl bölebilir ve parçalara bölebilirim?


125

Bu satırı bölmek istiyorum:

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

kesilmiş versiyonlarının bir dizisine:

"First Name"
"string"
"firstName"

Tüm bunları tek bir hatta nasıl yapabilirim? Aşağıdaki "void türü dönüştürülemiyor" hatası veriyor:

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

2
Hata döndürülür çünkü öğesinin ForEachgeçerli örneği üzerinde çalışır IEnumerableve döner void.
Majkel

Yanıtlar:


292

Deneyin

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

Bilginize, Foreach yöntemi parametre için bir Eylem alır (T alır ve void döndürür) ve lambda'nız dize olarak bir dize döndürür.

Foreach genişletme yöntemi, koleksiyondaki nesnelerin durumunu değiştirmeyi amaçlar. String değişmez olduğundan, bunun bir etkisi olmayacaktır.

Umarım yardımcı olur; o)

Cédric


3
Not: ForEachbir uzatma yöntemi değildir.
Guffa

Linq'te en iyi çözüm!
Sonhja

Ya hiçbir değer yoksa boş döndürür?
06'da Demodave

satır boşsa, bir istisna elde edersiniz. satır ';' içermiyorsa trimmid hattına karşılık gelen tek dizeli bir listeniz olacak
Cédric Rup

22

ForEachEğer bir değişkene o atanamıyor böylece yöntem, bir şey döndürmez.

Kullanım Selectyerine uzatma yöntemi:

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

5

Çünkü p.Trim () yeni bir dize döndürür.

Kullanmanız gerekenler:

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

3

Alternatif olarak şunu deneyin:

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

Bu harika bir fikir, ancak dizenin sonundaki boşlukların eksik olduğuna inanıyorum, değil mi?
jrichview

3

İşte bir uzatma yöntemi ...

    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

Regex kullanmayı deneyin:

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

0

Bölme, string [] türünü döndürür. Bir uzatma yöntemi yazın:

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;
}

Çözümünüzü beğendim, bu yüzden ona eklemeye ve daha kullanışlı hale getirmeye karar verdim.

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

Normal İfade Kullan

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());

Sonuç:

şilin

jon

adam

francis

luke

rüzgâraltı

şilin

[,; \ S] kalıbını açıklayın:,; veya boşluk karakteri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.