在 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 重现了此行为。呼唤ToList
on the IEnumerable
在访问创建的对象之前使这个问题消失。
它的发生是因为created
是一个查询,而不是一个结果。因此,每次枚举它时,您都在评估Select
重新从头开始。
如果你想让这个工作,使created
一个实际的列表,而不仅仅是一个IEnumerable
代表一个查询。
例如,添加:
created = created.ToList();
You say:
我希望 foreach 语句执行查询,并触发对象的创建
这正是正在发生的事情。问题是每次迭代时都会创建对象created
,不仅仅是第一次。自从ElementAt()
方法迭代created
,它只是创建新的A
s again.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)