繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM