Dlaczego to zapytanie LINQ nie jest wykonywane podczas korzystania z foreach?
Podczas tworzenia nowych obiektów w instrukcji LINQ, na przykład:
var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();
Z klasą A wyglądającą tak:
class A
{
public string Label;
}
A następnie modyfikowanie właściwości w A za pomocą pętli foreach:
foreach (var c in created) {
c.Label = "Set";
}
Dlaczego wartości nie są ustawiane podczas uzyskiwania dostępu do obiektów wIEnumerable
potem. Na przykład. następujące stwierdzenie nie powiedzie się:
Assert.AreEqual("Set", created.ElementAt(2).Label);
Zastanawiam się, dlaczego tak się dzieje. Oczekiwałbym, że instrukcja foreach wykona zapytanie i wywoła tworzenie obiektów. Dokumentacja MSDN stwierdza:„Wykonanie zapytania jest odroczone, dopóki zmienna zapytania nie zostanie powtórzona w pętli foreach lub For Each”.
Powtórzyłem to zachowanie za pomocą .NET 4.5 i Mono 3.2.0. PowołanieToList
naIEnumerable
przed uzyskaniem dostępu do utworzonego obiektu problem ten zniknie.