2009-11-13 8 views
86

Chcę podzielić ten wiersz:Jak mogę podzielić i przyciąć łańcuch na części w jednym wierszu?

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

na tablicę ich przyciętych wersjach:

"First Name" 
"string" 
"firstName" 

Jak mogę zrobić to wszystko w jednej linii? Poniższa daje mi błąd "nie można przekonwertować typu pustkę":

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

Myślę, że tytuł pytania powinien brzmieć "Jak mogę" zamiast "Dlaczego mogę"? – rahul

+1

Błąd jest zwracany, ponieważ 'ForEach' działa na bieżącej instancji' IEnumerable' i zwraca 'void'. – Majkel

Odpowiedz

203

Spróbuj

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

FYI, metoda Foreach trwa akcja (trwa T i zwraca void) dla parametru, a lambda zwraca ciąg jako łańcuch.Trim zwraca ciąg

Metoda przedłużania foreach służy do modyfikowania stanu obiektów w kolekcji. Jako ciąg są niezmienne, będzie to miało żadnego wpływu

nadzieję, że pomoże; o)

Cédric

+3

Uwaga: 'ForEach' nie jest metodą rozszerzenia. – Guffa

+0

Najlepsze rozwiązanie w Linq! – Sonhja

18

ForEach metoda nie zwraca niczego, więc nie można przypisać, że do zmiennej.

Użyj metody Select przedłużacza Zamiast:

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

Ponieważ p.Trim() zwraca nowy łańcuch.

Trzeba użyć:

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

Ewentualnie spróbuj tego:

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

Jest to świetny pomysł, jednak uważam, że tęskni za końcowymi ciągami na końcu łańcucha, prawda? – jrichview

1

Oto metoda rozszerzenie ...

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

spróbować użyć wyrażenia regularnego:

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

użyć wyrażenia regularnego

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

Wynik:

bob

jon

człowiek

Francis

Łuk

Lee

Bob

wyjaśnić wzór [,; \ y] Dopasowanie jedno wystąpienie albo, ; lub znak przestrzeni

Powiązane problemy