2009-11-13 85 views
86

我想這條線拆分:如何在一行中將字符串拆分並修剪成部分?

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

到他們的修剪版本的數組:

"First Name" 
"string" 
"firstName" 

我怎樣才能做到這一切在同一行?下面給我一個錯誤「無法轉換爲void類型」:

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

我認爲問題標題應該是'我怎樣'而不是'我爲什麼'? – rahul 2009-11-13 10:10:21

+1

由於'ForEach'在當前IEnumerable實例上工作並返回'void',所以返回錯誤。 – Majkel 2009-11-13 10:13:05

回答

203

嘗試

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

僅供參考,在Foreach方法需要一個動作(取T和返回void)的參數,和你的拉姆達返回一個字符串作爲string.Trim返回一個字符串

Foreach擴展方法是爲了修改集合中對象的狀態。由於字符串是不可變的,這會沒有效果

希望它能幫助; O)

塞德里克

+3

注意:'ForEach'不是擴展方法。 – Guffa 2012-03-15 23:52:27

+0

Linq的最佳解決方案! – Sonhja 2016-04-22 13:55:12

18

ForEach方法不返回任何東西,所以你不能分配給一個變量。

使用Select擴展方法代替:

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

因爲p.Trim()返回一個新字符串。

您需要使用:

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

或者試試這個:

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

這是一個好主意,但是,我相信錯過了字符串末尾的任何尾隨空白,對嗎? – jrichview 2017-06-01 18:13:06

1

下面是一個擴展方法...

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

嘗試使用正則表達式:

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

使用正則表達式

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

結果:

鮑勃

喬恩

弗朗西斯

盧克

擺錘

解釋圖案[,; \ S]:匹配任一之一發生, ;或空格字符