Was gibt LINQ zurück, wenn die Ergebnisse leer sind?

319

Ich habe eine Frage zur LINQ-Abfrage. Normalerweise gibt eine Abfrage einen IEnumerable<T>Typ zurück. Wenn die Rückgabe leer ist, ist nicht sicher, ob sie null ist oder nicht. Ich bin nicht sicher, ob das Folgende ToList()eine Ausnahme auslöst oder nur eine leere, List<string>wenn nichts im IEnumerableErgebnis gefunden wird.

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Ich weiß, dass es eine sehr einfache Frage ist, aber ich habe derzeit kein VS zur Verfügung.

David.Chu.ca
quelle
11
Ich denke, das Ergebnis ist Enumerable.Empty?
David.Chu.ca

Antworten:

512

Es wird eine leere Aufzählung zurückgegeben. Es wird nicht null sein. Du kannst gut schlafen :)

Leppie
quelle
38

Sie können auch die .Any()Methode überprüfen :

if (!YourResult.Any())

Nur eine Notiz, .Anymit der die Datensätze weiterhin aus der Datenbank abgerufen werden. Das Ausführen von a .FirstOrDefault()/.Where()ist genauso viel Aufwand, aber Sie können dann die von der Abfrage zurückgegebenen Objekte abfangen

Noich
quelle
5
Wo erwähnt die Frage eine Datenbank?
Cja
4
Sie müssen denjenigen fragen, der bearbeitet hat, ich habe keine DB erwähnt :)
Noich
Der Punkteditor macht zwar Sound, DB oder nicht. Ich glaube, sie sagen, dass sie .Any()Ihnen nur sagen werden, ob Sie überhaupt übereinstimmende Datensätze haben, bei denen eine tatsächliche Abfrage zum Finden eines bestimmten Werts möglicherweise null ist, wenn dies .Any()nicht der Fall ist.
Vapcguy
1
Die Bearbeitung könnte tatsächlich falsch sein. Wenn Sie linq für Entitäten verwenden, kann die Datenbank dies verkürzen, und es werden überhaupt keine Daten an den Client gesendet, außer wahr oder falsch
Mafii
19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Dump ist von LinqPad )

JP Alioto
quelle
Genau! Sie erhalten einen besseren Hinweis auf die Ergebnisse
netfed
TIL Count()ist auch eine Methode, nicht nur die Eigenschaft
heyNow
2
Sollten Sie nicht .Any () verwenden, da count alle Elemente auflistet?
SHEePYTaGGeRNeP
16

.ToList gibt eine leere Liste zurück. (wie neue Liste ());

Paul van Brenk
quelle
8

Wenn Sie in Linq-to-SQL versuchen, das erste Element in einer Abfrage ohne Ergebnisse abzurufen, wird eine sequence contains no elementsFehlermeldung angezeigt. Ich kann Ihnen versichern, dass der erwähnte Fehler nicht gleich ist object reference not set to an instance of an object. abschließend nein, es wird nicht null zurückgegeben, da null nicht sagen kann, dass sequence contains no elementses immer sagen wird object reference not set to an instance of an object;)

Kay One
quelle
1
Oh, deine Erklärung hilft beim weiteren Verständnis. Vielen Dank !
Kay Lee
Beantwortet dies die Frage?
ChiefTwoPencils
7

Andere Beiträge hier haben deutlich gemacht, dass das Ergebnis eine "leere" IQueryable ist, die ToList () korrekt in eine leere Liste usw. ändert.

Seien Sie vorsichtig mit einigen Operatoren, da diese werfen, wenn Sie ihnen eine leere Aufzählung senden. Dies kann passieren, wenn Sie sie miteinander verketten.

Spence
quelle
3
"Seien Sie vorsichtig mit einigen Operatoren, da diese werfen, wenn Sie ihnen eine leere Aufzählung senden. Dies kann passieren, wenn Sie sie miteinander verketten." - Das hat mich erwischt. Ich hatte einen Null-Rückgabewert, den ich dann in eine andere Abfrage eingespeist habe. Dies führte dazu, dass die zweite Abfrage unabhängig von dem, in den ich sie umgewandelt habe, ausgelöst wurde, da der zweiten Abfrage kein Wert zugeführt wurde.
Trevorc
6

Es wird keine Ausnahme ausgelöst, Sie erhalten eine leere Liste.

Jimmy Chandra
quelle