2013-02-15 60 views
11

我只是想知道爲什麼這個ForEach不起作用,並將值留在尾部的空白處。ForEach在字符串數組中修整字符串的值

string days = "Monday, Tuesday, Wednesday, Thursday, Friday"; 

string[] m_days = days.Split(','); 

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

我知道還有其他的方式做到這一點,所以我不需要和在那裏回答。

回答

19

因爲你不重新分配修剪字符串。

var list = m_days.Split(',').Select(s => s.Trim()).ToList(); 

爲什麼ForEach不起作用,或者如果我使用的是錯誤ForEach

ForEach不是Linq,它是一種方法List<T>。你在做什麼基本上是這樣的:

foreach(string day in m_days) 
{ 
    day.Trim(); // you are throwing away the new string 
} 
+0

你好我想知道爲什麼ForEach不起作用,或者我錯誤地使用了ForEach。我知道你可以使用Select語句... – David 2013-02-15 12:19:08

+0

@David:請參閱我的答案,瞭解爲什麼不能使用ForEach來完成此任務。 – 2013-02-15 12:22:01

+1

@David:'ForEach'不是Linq,它是'List '的一種方法。編輯我的答案。 – 2013-02-15 12:25:18

4

你需要你的foreach輸出分配到一個新的變量,就像這樣:

var trimmedResult = m_days.Select(d => d.Trim()).ToList(); 
3

因爲String.Trim()不會修改原始字符串。當你打電話給ForEach(d => d.Trim())時,你會爲每一個列表項目在內存中創建新的修剪過的字符串,但是這個字符串不會被分配到任何地方。那是你在做什麼:

foreach(string d in list) 
{ 
    d.Trim(); 
} 

你需要的是

m_days = days.Split(',').Select(d => d.Trim()).ToArray(); 
+1

哇。有人認爲String.Trim修改原始字符串? – 2013-02-15 12:15:44

3

string.Trim返回一個新字符串實例。所以你必須以某種方式使用那個新的實例。
你沒有在你的代碼中這樣做。
此外,這是不可能的ForEach。乍一看,下面可以工作:

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

但是,這不會幫助你們,因爲d不按引用傳遞,所以你只更改已傳遞到您的委託當地的參數而不是存儲在列表中的實例。

您很可能希望這樣:

var result = days.Split(',').Select(x => x.Trim()).ToList(); 

沒有LINQ的另一種方法是這樣的:

var split = days.Split(','); 
for(int i = 0; i < split.Length; ++i) 
    split[i] = split[i].Trim(); 
+0

擊敗了我的帖子,但這是最好的解決方案imo – JMan 2013-02-15 12:17:01

+0

好的,無需發佈進一步的替代品。我知道替代品。我想我可能誤解了ForEach的使用。我只是想知道爲什麼Foreach無法正常工作 – David 2013-02-15 12:27:43

+0

@David:好的,我在第一個代碼片段之後的部分中回答了這個問題。 – 2013-02-15 12:28:46