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