List的ForEach()方法没有按预期运行

BKR*_*BKR 1 c# foreach

为什么这不起作用?

List<int> test = new List<int>();
for (int i = 0; i < 20; ++i)
    test.Add(i);

test.ForEach(t =>  t = ++t);
Run Code Online (Sandbox Code Playgroud)

测试中的元素不会增加.

Viv*_*vek 5

整数是值,而不是引用。

另外,foreach 不允许操作集合元素。

所以我担心这是双重失败:(

什么会起作用:

for(int i=0;i<test.Count;i++)
    test[i]++;
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

首先,List<T>.ForEach不是LINQ的一部分.它从2.0开始就在.NET中.

测试中的元素不会增加

不,他们不会.参数to Action<T>传递,而不是通过引用传递.对参数(t在您的情况下)所做的更改对于调用代码是不可见的 - 即使它们是,也不能保证List<T>.ForEach会使用它们.

请注意,如果您有一个引用类型(例如StringBuilder)作为列表元素类型,并对参数值引用的对象中的数据进行了更改,例如

builders.ForEach(x => x.Append("Foo"))
Run Code Online (Sandbox Code Playgroud)

然后这些更改在列表中可见,因为它们根本不是对列表的更改 - 列表将包含与以前相同的引用,仅包含数据恰好已更改的对象.