gpt4 book ai didi

c# - 为什么在使用 foreach 时不执行此 LINQ 查询?

转载 作者:可可西里 更新时间:2023-11-01 09:11:53 26 4
gpt4 key购买 nike

在 LINQ 语句中创建新对象时,例如:

var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();

A 类看起来像这样:

class A
{
public string Label;
}

然后使用 foreach 循环修改 A 中的属性:

foreach (var c in created) {
c.Label = "Set";
}

为什么之后访问IEnumerable中的对象时没有设置值。例如。以下断言失败:

Assert.AreEqual("Set", created.ElementAt(2).Label);

我想知道为什么会这样。我希望 foreach 语句执行查询,并触发对象的创建。 MSDN 文档指出:"Execution of the query is deferred until the query variable is iterated over in a foreach or For Each loop" .

我已经用 .NET 4.5 和 Mono 3.2.0 重现了这种行为。在访问创建的对象之前调用 IEnumerable 上的 ToList 可以解决此问题。

最佳答案

它的发生是因为 created 是一个查询,而不是一个结果。因此,每次枚举它时,您都是从头开始重新计算 Select

如果你想让它工作,让 created 成为一个实际的列表,而不仅仅是一个代表查询的 IEnumerable

例如,添加:

created = created.ToList();

你说:

I would expect the foreach-statement to execute the query, and trigger the creation of the objects

这正是正在发生的事情。问题是每次迭代 created 时都会创建对象,而不仅仅是第一次。由于 ElementAt() 方法遍历 created,它只是再次创建新的 A

关于c# - 为什么在使用 foreach 时不执行此 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18917141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com