linq Mehrdeutigkeit auf wo und wählen Sie

8

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

%Vor%

Wenn beide auswählen und wo IEnumerable<T> zurückgeben, warum die Mehrdeutigkeit? Danke.

    
Gullu 15.11.2011, 20:47
quelle

4 Antworten

18

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.

    
George Duckett 15.11.2011, 20:49
quelle
2

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.

    
Mark Byers 15.11.2011 20:49
quelle
0

Die erste Abfrage gibt ein IEnumerable von booleans zurück.

Die zweite Abfrage gibt nur Elemente im Original zurück, die mit dem booleschen Ausdruck übereinstimmen.

    
McKay 15.11.2011 20:50
quelle
0

Die erste Anweisung erstellt ein IEnumerable von bools: ist das qty -Feld & gt; 0. Da es 10 Datensätze gibt, erhalten Sie 10 Bools.

Die zweite gibt ein IEnumerable zurück, das über die Bedingung gefiltert wurde.

    
drdwilcox 15.11.2011 20:51
quelle

Tags und Links