2

为什么这不起作用?

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

test.ForEach(t =>  t = ++t);

test 中的元素不会增加。

4

5 回答 5

5

首先,List<T>.ForEach它不是 LINQ 的一部分。自 2.0 以来,它一直在 .NET 中。

测试中的元素不递增

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

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

builders.ForEach(x => x.Append("Foo"))

那么这些更改在列表中可见,因为它们根本不是对列表的更改 - 列表将包含与以前相同的引用,只是对数据发生更改的对象的引用。

于 2013-09-09T17:11:21.523 回答
4

整数是值,而不是引用。

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

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

什么会起作用:

for(int i=0;i<test.Count;i++)
    test[i]++;
于 2013-09-09T17:10:58.547 回答
1

您拥有的t变量是列表中项目的副本。您正在修改副本,因此列表中的项目本身不受影响。要增加列表中的每个项目,您可以使用for循环:

for(int i = 0; i < test.Count;i++
    test[i]++;
于 2013-09-09T17:12:19.600 回答
1

这是预期的结果。

您不会期望以下内容实际增加xin Main,因此您的 lambda 示例也不例外。

static void Main(string[] args)
{
    int x = 1;
    Increment(x);
    Console.WriteLine("{0}");
}

static void Increment(int x)
{
    x = ++x;
}
于 2013-09-09T17:12:45.283 回答
0
List<int> test = new List<int>();
for (int i = 0; i < 20; ++i)
test.Add(i);
for(var z = 0 ; z < test.Count; z++)
{
    test[z]++;
}
于 2013-09-09T17:17:00.953 回答