为何List.ForEach无法移除字符串空格,而LINQ Select可以?
为什么两段代码的效果不一样?
嘿,这个问题问到点子上了!核心原因其实藏在C#字符串的特性以及两个方法的工作逻辑里,咱们掰开揉碎了说:
1. 第一段代码失效的根源:字符串不可变性 + 循环变量是副本
首先得明确一个C#的基础知识点:string类型是不可变的。也就是说,当你调用a.Replace(" ", "")的时候,它并不会修改原来的字符串a,而是返回一个移除了空格的新字符串。
再看这段代码:
var arr = new[] {"A ", "B ", "C "}.ToList(); arr.ForEach(a => a = a.Replace(" ", ""));
这里的a是集合中每个元素的副本——你可以理解成把原集合里的字符串复制了一份到临时变量a里,然后给这个副本赋值了新的无空格字符串。但原集合里的元素根本没被触动,所以执行完之后,arr里还是原来带空格的字符串。
2. 第二段代码生效的原因:LINQ的Select生成新序列
再看这段代码:
arr = arr.Select(a => a.Replace(" ", "")).ToList();
Select是LINQ里的投影方法,它会遍历原集合的每一个元素,对每个元素执行Replace得到新的无空格字符串,然后把这些新字符串组装成一个全新的序列。最后ToList()把这个序列转换成新的List对象,再赋值给arr变量——这时候arr已经指向了包含处理后字符串的新集合,自然就能看到空格被移除的效果了。
额外小技巧:如果想用类似ForEach的方式修改原集合怎么办?
如果你非要用遍历修改原集合的方式(而不是生成新集合),可以用普通的for循环直接操作索引:
for (int i = 0; i < arr.Count; i++) { arr[i] = arr[i].Replace(" ", ""); }
这样就能直接修改原集合中对应索引位置的元素,达到移除空格的目的。
内容的提问来源于stack exchange,提问作者codecasanovatest
相关产品推荐
相关产品推荐

