我只是想知道为什么这个 ForEach 不起作用并且在值后面留下空格。
string days = "Monday, Tuesday, Wednesday, Thursday, Friday";
string[] m_days = days.Split(',');
m_days.ToList().ForEach(d => { d = d.Trim(); } );
我知道还有其他方法可以做到这一点,所以我不需要在那里回答。
因为您没有重新分配修剪后的字符串。
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();
}
您需要将 ForEach 的输出分配给一个新变量,如下所示:
var trimmedResult = m_days.Select(d => d.Trim()).ToList();
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();
因为String.Trim()
不要修改原始字符串。当您调用时,ForEach(d => d.Trim())
您会在内存中为列表的每个项目创建新的修剪字符串,但该字符串未分配到任何地方。这就是你在做什么:
foreach(string d in list)
{
d.Trim();
}
你需要的是
m_days = days.Split(',').Select(d => d.Trim()).ToArray();