Heute bin ich auf ein Problem mit LINQ zu Objekten (nicht SQL) gestoßen, das wegen eines Tippfehlers auftauchte. Ich hatte einen .Select
einen Ort und einen .Where
an einem anderen Ort. Ich habe dasselbe Ergebnis erwartet, aber sie zeigen unterschiedliche Zahlen. Angenommen, somelist
hat 10 Elemente mit allen Elementen mit qty
= 0
Wenn beide auswählen und wo IEnumerable<T>
zurückgeben, warum die Mehrdeutigkeit? Danke.
Select
ist eine Projektion, also erhalten Sie den Ausdruck p.qty > 0
bewertet für jedes Element in somelist
. d. h. viele Wahr / Falsch-Werte (die gleiche Anzahl wie Ihre ursprüngliche Liste). Wenn Sie also Count
eingeben, erhalten Sie dieselbe Nummer. Wenn Sie schauen, gibt die Auswahl IEnumerable<bool>
zurück (weil der Typ von p.qty > 0
ein bool ist).
Where
filtert die Ergebnisse, sodass die Zählung auf der gefilterten Liste ausgeführt wird und Ihnen angezeigt wird die erwarteten Ergebnisse. Der Typ ist IEnumerable<TypeOfElementInOriginalList>
.
Sie können auch Folgendes tun: somelist.Count(p => p.qty > 0)
, weil Count eine Überladung aufweist, die ein akzeptiert Prädikat zum Filtern nach.
Die erste Abfrage gibt das gleiche wie somelist.Count()
. Es ist nur die Anzahl der Elemente in der Sequenz. Der Aufruf von Select
Projekte pro Objekt, aber die Anzahl der Objekte bleibt gleich.
Die zweite Abfrage gibt die Anzahl der Elemente an, die das Prädikat erfüllen. Dies ist eine potenziell niedrigere Anzahl. Der Aufruf von Where
filtert Objekte aus der Sequenz.