簡體   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