Wie funktioniert die folgende LINQ- Anweisung?
Hier ist mein Code:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
Ausgabe: 2, 4, 6, 8
Warum nicht 2, 4, 6
?
Antworten:
Die Ausgabe erfolgt
2,4,6,8
aufgrund einer verzögerten Ausführung .Es gibt eine andere Ausführung namens Sofortige Abfrageausführung, die zum Zwischenspeichern von Abfrageergebnissen hilfreich ist. Nochmals von Suprotim Agarwal:
Wenn die Ausgabe erfolgen soll
2,4,6
, verwenden Sie.ToList()
:quelle
.First()
,.FirstOrDefault()
,.Single()
und.SingleOrDefault()
auslösen auch die Auswertung der Abfrage.Dies ist auf eine verzögerte Ausführung zurückzuführen, was bedeutet, dass die Berechnung des Ausdrucks erst ausgeführt wird, wenn er irgendwo benötigt wird. Dies verbessert die Leistung, wenn die Daten zu groß sind.
quelle
Der Grund dafür ist die verzögerte Ausführung Ihres Lambda-Ausdrucks. Die Abfrage wird ausgeführt, wenn Sie mit der Iteration in der foreach-Schleife beginnen.
quelle
Wenn Sie eine IEnumerable <> verwenden, die von LINQ erhalten wurde, wird nur eine Enumerator-Klasse erstellt, und die Iteration beginnt erst, wenn Sie sie in einem bestimmten Schritt verwenden.
quelle
Sie erhalten dieses Ergebnis aufgrund einer verzögerten Ausführung, was bedeutet, dass das Ergebnis erst beim ersten Zugriff ausgewertet wird.
Um es klarer zu machen, fügen Sie einfach 10 zur Liste am Ende Ihres Snipets hinzu und drucken Sie dann erneut. Sie erhalten keine 10 in der Ausgabe
quelle
10
in die Ausgabe.8
in keiner Ausgabe mehr enthalten sein.