我偶然发现List<T>
行为,我不太确定我能理解。
我有以下示例代码
List<int> myInts = new List<int>() {1, 2, 3, 4, 5};
myInts.ForEach( x => x += 1);
然而,在ForEach声明之后,该列表保持不变。有人可以向我解释原因吗?
答案 0 :(得分:3)
int
是value type,这意味着当调用ForEach
中的lambda函数时,会传递int
值的副本,而不是lambda可用于原始值的参考。正在修改此副本,而不是列表中的原始值。
如果您希望修改列表,您需要遍历列表,逐个修改每个条目,或者返回并分配一个包含更新值的新列表:
//loop through and modify:
for (var x = 0; x < myInts.Count; x++)
myInts[x] += 1;
//or use Select to construct a new list:
myInts = myInts.Select(x => x += 1).ToList();
答案 1 :(得分:1)
James Thorpe的回答是完全正确的,但我想详细说明ForEach
与Select
IEnumerable
之间的差异是的。
<强>的ForEach 强>
当你想要使用块lambda(意味着不仅仅是像大多数lambda表达式一样的单个表达式)时,应该使用它。一般来说,这并没有大量使用(因为你经历过的原因);你最好只使用foreach
阻止。
选择强>
这是为了将<{1}}的内容投射到另一个表单中;这意味着它完全你正在寻找什么。当你想要浏览每个元素并将内容转换成其他元素时,应该使用它。