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

前端之家收集整理的这篇文章主要介绍了c# – 为什么在使用foreach时LINQ查询不执行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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-statement执行查询,并触发对象的创建. 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会使此问题消失.

解决方法

这是因为创建的是查询,而不是结果.所以,每次你列举它,你都从头开始评估选择.

如果你想要这个工作,创建一个实际的列表,而不是只是一个表示一个查询的IEnumerable.

例如,添加

created = created.ToList();

你说:

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

这正是发生了什么.问题是每次迭代创建的对象的创建,而不仅仅是第一次.由于ElementAt()方法迭代创建,它只是再次创建新的As.

原文链接:https://www.f2er.com/csharp/93914.html

猜你在找的C#相关文章