我只是想知道为什么这个ForEach不起作用并且留下带有尾随空格的值。
string days = "Monday, Tuesday, Wednesday, Thursday, Friday";
string[] m_days = days.Split(',');
m_days.ToList().ForEach(d => { d = d.Trim(); } );
我知道还有其他方法可以做到这一点,所以我不需要和回答。
答案 0 :(得分:23)
因为您没有重新分配修剪后的字符串。
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
}
您也可以使用for
- 循环来代替使用LINQ:
for(int i = 0; i < m_days.Length; i++)
{
m_days[i] = m_days[i].Trim();
}
答案 1 :(得分:4)
您需要将ForEach的输出分配给一个新变量,如下所示:
var trimmedResult = m_days.Select(d => d.Trim()).ToList();
答案 2 :(得分:3)
因为String.Trim()
不修改原始字符串。当您调用ForEach(d => d.Trim())
时,您在内存中为每个列表项创建新的修剪字符串,但该字符串未在任何位置分配。多数民众赞成你在做什么:
foreach(string d in list)
{
d.Trim();
}
您需要的是
m_days = days.Split(',').Select(d => d.Trim()).ToArray();
答案 3 :(得分: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();