13

我只是想知道为什么这个 ForEach 不起作用并且在值后面留下空格。

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

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

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

我知道还有其他方法可以做到这一点,所以我不需要在那里回答。

4

4 回答 4

28

因为您没有重新分配修剪后的字符串。

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 returned by String.Trim
}

除了使用 LINQ,您还可以使用for-loop 代替:

for(int i = 0; i < m_days.Length; i++)
{
    m_days[i] = m_days[i].Trim();
}
于 2013-02-15T12:15:48.747 回答
4

您需要将 ForEach 的输出分配给一个新变量,如下所示:

var trimmedResult = m_days.Select(d => d.Trim()).ToList();
于 2013-02-15T12:14:35.133 回答
4

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();
于 2013-02-15T12:14:45.130 回答
3

因为String.Trim()不要修改原始字符串。当您调用时,ForEach(d => d.Trim())您会在内存中为列表的每个项目创建新的修剪字符串,但该字符串未分配到任何地方。这就是你在做什么:

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

你需要的是

m_days = days.Split(',').Select(d => d.Trim()).ToArray();
于 2013-02-15T12:14:37.483 回答