2009-10-07 13 views
7

Was genau kehrt eine LINQ-Funktion zurück, wenn keine Übereinstimmungen vorhanden sind? Beispiel:LINQ-Ergebnisse, wenn keine Übereinstimmungen vorhanden sind?

var numbers = Enumerable.Range(1, 10); 
var results = numbers.Where(n => n == 50); 

Was wären zu diesem Zeitpunkt die Ergebnisse?

+3

Was wäre in "Ergebnisse" ist * ein Objekt, das die Abfrage * darstellt. Denken Sie daran: Das Abfrageobjekt ist NICHT das Ergebnis der Abfrage. Das Abfrageobjekt ist etwas, das Sie * zum Erhalt der Ergebnisse der Abfrage * iterieren können, es sind nicht die Ergebnisse selbst. –

Antwort

9

results selbst ist nur eine Abfrage. Bis Sie beginnen, es zu durchlaufen (entweder explizit oder über einen Anruf wie Count()), hat nichts überprüft, ob es Ergebnisse gibt oder nicht. Nur wenn du es aufzählst, wird alles passieren.

So könnten Sie tun:

foreach (int x in results) 
{ 
    Console.WriteLine("This won't happen"); 
} 

Oder:

Console.WriteLine(results.Any()); // Will print false 
Console.WriteLine(results.Count()); // Will print 0 

Jede dieser bewirkt, dass das Prädikat gegen jedes Element im Bereich ausgewertet werden ... aber bis dahin, es gewann Ich werde überhaupt nicht angerufen.

Dies ist eine wichtige Sache zu verstehen, weil es, dass resultsbedeutetnull konnte nicht sein, während das Merkmal der lazy evaluation beibehalten - bis Sie Gebrauch versuchtenresults, wäre es nicht, ob es funktioniert hat sollte null oder nicht sein!

+0

Ich habe alles über faule Bewertung vergessen. * smacks self * – jasonh

+0

Beachten Sie, dass die "Abfrage", von der Sie sprechen, wirklich ein IEnumerable irgendeiner Art ist, das seine Daten tatsächlich nicht gefüllt hat ... – RCIX

2

Ein Verweis auf eine leere IEnumerable<T>.

+0

Ausgezeichnet! Das habe ich gesucht. Ich wollte sicher sein, dass ich nicht nach Null suchen musste. – jasonh

+1

Nitpick: Ein Verweis auf ein leeres IEnumerable - keine Sammlung –

+0

Yup Sie sind sicher, es ist zuckerhaltige Güte! –

4

In diesem Fall wird IEnumerable<Int32> mit einer Anzahl von 0 Elementen zurückgegeben.

+4

Das klingt, als ob es weiß, dass es eine Zählung von 0 gibt - was nicht der Fall ist. Der zurückgegebene Wert ist ein "IEnumerable ", der beim Iterieren 0 Elemente ergibt. Es weiß das aber vorher nicht - es muss das Prädikat gegen jeden Wert versuchen, um es herauszufinden, und es tut das nicht, bis du es fragst. –

+0

@Jon: definitiv, danke für die Klärung. Wie Sie in Ihrem Beitrag erwähnt haben, muss es verwendet werden, um das Ergebnis zu bestimmen. –

Verwandte Themen