使用ForEach语句修改列表元素

时间:2015-10-01 20:18:44

标签: c# list lambda

我偶然发现List<T>行为,我不太确定我能理解。 我有以下示例代码

List<int> myInts = new List<int>() {1, 2, 3, 4, 5};
myInts.ForEach( x => x += 1);

然而,在ForEach声明之后,该列表保持不变。有人可以向我解释原因吗?

2 个答案:

答案 0 :(得分:3)

intvalue 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的回答是完全正确的,但我想详细说明ForEachSelect IEnumerable之间的差异是的。

<强>的ForEach

当你想要使用块lambda(意味着不仅仅是像大多数lambda表达式一样的单个表达式)时,应该使用它。一般来说,这并没有大量使用(因为你经历过的原因);你最好只使用foreach阻止。

选择

这是为了将<{1}}的内容投射到另一个表单中;这意味着它完全你正在寻找什么。当你想要浏览每个元素并将内容转换成其他元素时,应该使用它。