用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语句之后保持不变。有人能给我解释一下吗?
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的回答完全正确,但我想详细说明IEnumerable
上ForEach
和Select
的差异是什么。
ForEach
当你想使用块lambda(意味着不仅仅是像大多数lambda表达式一样的单个表达式)时应该使用。一般来说,这不会被大量使用(因为你已经经历过的原因);你最好使用foreach
块。
选择
这用于将 IEnumerable
的内容投影成另一种形式;这意味着正是你要找的。当您想遍历每个元素并将内容转换为其他内容时,应该使用它。