Warum geben List.Count () und IEnumerable.Count () unterschiedliche Ergebnisse zurück?

7

Wir haben dieses Array in LINQ.

%Vor%

und dieser Code gibt 0 zurück.

%Vor%

und andere Rückkehr 1.

%Vor%

Warum passiert es? Was ist der Unterschied zwischen Liste und Ienumerable?

    
Reza Mohammady 26.09.2014, 09:58
quelle

2 Antworten

19

Die Methode Where führt Ihre Abfrage nicht aus - sie erstellt nur eine Abfrage, die dann ausgeführt wird, wenn die Daten angefordert werden. Dies wird als verzögerte Ausführung bezeichnet. In Ihrem ersten Snippet wird der Filter nur angewendet, wenn Count() aufgerufen wird - also , nachdem das Element red entfernt wurde.

Im zweiten Snippet erzwingt Ihr Aufruf von ToList() , dass die Abfrage sofort ausgeführt wird, um eine neue Liste zu erstellen. Dies ist dann völlig unabhängig von der ursprünglichen Liste - das Entfernen eines Elements aus der ursprünglichen Liste hat keinen Einfluss auf die Ergebnisse.

Dies ist nicht abhängig vom Deklarationstyp von q3 - der wichtige Unterschied ist nur der Aufruf von ToList() . Wenn Sie also das zweite Snippet zu:

ändern %Vor%

... Sie werden den gleichen Effekt sehen. Die Abfrage wird ausgeführt, bevor das Objekt entfernt wird. Zu diesem Zeitpunkt ist die ursprüngliche Liste für den Inhalt von q3 nicht relevant.

Weitere Einzelheiten zu LINQ finden Sie in meiner Edulinq-Blogserie .

    
Jon Skeet 26.09.2014 10:01
quelle
0

IEnumerable ist eine Schnittstelle und eine Liste ist eine Klasse.
Und IEnumerable kann nur die Werte speichern, aber Sie können sie nicht bearbeiten, wie Werte hinzufügen oder entfernen.

Auch wenn Sie .ToList() ausführen, wird die Abfrage für die Datenbank ausgeführt, wenn Sie Elemente aus der Datenbank auswählen.

    
VRC 26.09.2014 10:01
quelle

Tags und Links