用ForEach语句修改一个列表'

本文关键字:列表 一个 语句 ForEach 修改 | 更新日期: 2023-09-27 18:15:48

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

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

列表在ForEach语句之后保持不变。有人能给我解释一下吗?

用ForEach语句修改一个列表'

int是一个值类型,这意味着当调用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();

James Thorpe的回答完全正确,但我想详细说明IEnumerableForEachSelect差异是什么。

ForEach

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

选择

这用于 IEnumerable的内容投影成另一种形式;这意味着正是你要找的。当您想遍历每个元素并将内容转换为其他内容时,应该使用它。