List 的 ForEach() 方法未按预期运行
本文关键字:运行 方法 ForEach List | 更新日期: 2023-09-27 18:30:52
为什么这不起作用?
List<int> test = new List<int>();
for (int i = 0; i < 20; ++i)
test.Add(i);
test.ForEach(t => t = ++t);
测试中的元素不会递增。
首先,List<T>.ForEach
不是 LINQ 的一部分。自 2.0 以来,它一直在 .NET 中。
测试中的元素不递增
不,他们不会。要Action<T>
的参数是按值传递的,而不是按引用传递的。对参数所做的更改(在您的情况下t
)对调用代码不可见 - 即使它们是,也不能保证List<T>.ForEach
会使用它们。
请注意,如果您有引用类型(例如 StringBuilder
) 作为列表元素类型,并对参数值所引用的对象中的数据进行了更改,例如
builders.ForEach(x => x.Append("Foo"))
然后,这些更改将在列表中可见,因为它们根本不是对列表的更改 - 列表将包含与以前相同的引用,只是对数据碰巧已更改的对象。
整数是值,而不是引用。
另外,foreach 不允许操作集合元素。
所以恐怕是双重失败:(
什么会起作用:
for(int i=0;i<test.Count;i++)
test[i]++;
您
拥有的t
变量是列表中项目的副本。 您正在修改副本,因此列表中的项目本身不受影响。 要递增列表中的每个项目,您可以使用for
循环:
for(int i = 0; i < test.Count;i++
test[i]++;
这是预期的结果。
您不会期望以下内容实际上在Main
中增加x
,因此您的lambda示例也不例外。
static void Main(string[] args)
{
int x = 1;
Increment(x);
Console.WriteLine("{0}");
}
static void Increment(int x)
{
x = ++x;
}
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]++;
}