2013-02-15 115 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