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

时间:2013-09-09 17:09:13

标签: c# foreach

为什么这不起作用?

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

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

测试中的元素不会增加。

5 个答案:

答案 0 :(得分:5)

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

  

测试中的元素不会增加

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

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

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

然后这些更改在列表中显示,因为它们根本不会更改列表 - 列表将包含与之前相同的引用,只是对象其数据发生了变化。

答案 1 :(得分:4)

Ints是值,而不是引用。

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

所以这是双重失败我害怕:(

什么可行:

for(int i=0;i<test.Count;i++)
    test[i]++;

答案 2 :(得分:1)

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

for(int i = 0; i < test.Count;i++
    test[i]++;

答案 3 :(得分:1)

这是预期的结果。

您不希望以下内容在x中实际增加Main,因此您的lambda示例也不例外。

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

static void Increment(int x)
{
    x = ++x;
}

答案 4 :(得分: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]++;
}