[英]Why is this LINQ query not executed when using foreach?
在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文档指出: “查询的执行被推迟,直到在foreach或For Each循环中迭代查询变量为止” 。
我已经用.NET 4.5和Mono 3.2.0复制了此行为。 在访问创建的对象之前在IEnumerable
上调用ToList
可以使此问题消失。
发生这种情况是因为created
是查询,而不是结果。 因此,每次枚举时,您都在重新评估Select
。
如果您希望此方法有效,请created
一个实际列表,而不只是一个表示查询的IEnumerable
。
例如,添加:
created = created.ToList();
你说:
我希望foreach语句能够执行查询,并触发对象的创建
这正是正在发生的事情。 问题在于,每次迭代created
对象时都会发生对象的created
,而不仅仅是第一次。 由于ElementAt()
方法遍历created
,因此仅在再次创建新A
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.