Co zwraca LINQ, gdy wyniki są puste

319

Mam pytanie dotyczące zapytania LINQ. Zwykle zapytanie zwraca IEnumerable<T>typ. Jeśli zwrot jest pusty, nie wiem, czy jest on zerowy, czy nie. Nie jestem pewien, czy poniższe ToList()zgłoszenie wyrzuci wyjątek, czy po prostu pusty, List<string>jeśli wynik nie zostanie znaleziony IEnumerable?

   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();

Wiem, że to bardzo proste pytanie, ale na razie nie mam VS.

David.Chu.ca
źródło
11
Myślę, że wynik jest wyliczalny. Pusty?
David.Chu.ca

Odpowiedzi:

512

Zwróci pusty wyliczalny. To nie będzie zero. Możesz spać dźwięk :)

leppie
źródło
38

Możesz także sprawdzić .Any()metodę:

if (!YourResult.Any())

Tylko uwaga, .Anyktóra nadal pobierze rekordy z bazy danych; wykonanie .FirstOrDefault()/.Where()będzie tak samo narzutem, ale będziesz w stanie złapać obiekty zwrócone z zapytania

Noich
źródło
5
Gdzie pytanie wspomina o bazie danych?
cja
4
Będziesz musiał zapytać tego, który edytował, nie wspominałem o żadnej DB :)
Noich
Edytor punktów sprawia, że ​​jest zdrowy, DB, czy nie. Wierzę, że mówią, że .Any()po prostu powie ci, czy masz w ogóle jakieś pasujące rekordy, gdzie wykonanie rzeczywistego zapytania w celu znalezienia określonej wartości może być zerowe, gdy .Any()nie jest.
vapcguy
1
Edycja może być naprawdę niepoprawna. Jeśli używasz linq do encji, db może to skrócić i żadne dane nie są wysyłane do klienta, z wyjątkiem prawdziwej lub fałszywej
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

(Zrzut pochodzi z LinqPad )

JP Alioto
źródło
Dokładnie! Lepsze wskazanie wyników
netfed
TIL Count()to także metoda, a nie tylko właściwość
hejNow
2
Nie powinieneś używać .Any (), ponieważ liczba będzie wyliczać wszystkie pozycje?
SHEePYTaGGeRNeP
16

.ToList zwraca pustą listę. (to samo co nowa List ());

Paul van Brenk
źródło
8

W Linq-to-SQL, jeśli spróbujesz uzyskać pierwszy element zapytania bez rezultatów, pojawi się sequence contains no elementsbłąd. Zapewniam cię, że wspomniany błąd nie jest równy object reference not set to an instance of an object. podsumowując nie, nie zwróci wartości null, ponieważ null nie może powiedzieć, sequence contains no elementsże zawsze będzie mówić object reference not set to an instance of an object;)

kay.one
źródło
1
Och, twoje wyjaśnienie pomaga w dalszym zrozumieniu. Dziękuję Ci !
Kay Lee,
Czy to odpowiada na pytanie?
ChiefTwoPencils
7

Inne posty tutaj wyjaśniły, że wynikiem jest „pusty” IQueryable, który ToList () poprawnie zmieni na pustą listę itp.

Bądź ostrożny z niektórymi operatorami, ponieważ będą rzucać, jeśli wyślesz im pustą listę. Może się to zdarzyć, gdy połączysz je razem.

Spence
źródło
3
„Bądź ostrożny z niektórymi operatorami, ponieważ rzucą ci, jeśli wyślesz im pustą wyliczenie. Może się to zdarzyć, gdy połączysz ich w sieć”. - To mnie ma. Miałem wartość zerową, którą następnie wprowadziłem do innego zapytania. Spowodowało to, że drugie zapytanie zostało rzucone bez względu na to, do czego go rzuciłem, ponieważ do drugiego zapytania nie wprowadzono żadnej wartości.
trevorc
6

Nie wyrzuci wyjątku, otrzymasz pustą listę.

Jimmy Chandra
źródło