2009-10-07 10 views
7

Co dokładnie zwraca funkcja LINQ, gdy nie ma pasujących elementów? Metoda Where, na przykład:Wyniki LINQ, gdy nie ma dopasowań?

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

Jakie byłyby wyniki w tym momencie?

+3

W "wynikach" znajduje się * obiekt reprezentujący zapytanie *. Pamiętaj: obiekt zapytania NIE jest wynikiem zapytania. Obiekt zapytania to coś, co możesz * iterować, aby uzyskać wyniki zapytania *, to nie jest sam wynik. –

Odpowiedz

9

results sama jest tylko kwerendą. Dopóki nie rozpoczniesz iteracji (jawnie lub przez wywołanie takie jak Count()), nic nie sprawdziło, czy są jakieś wyniki, czy nie. Dopiero gdy ją wyliczysz, wszystko się wydarzy.

Więc można zrobić:

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

Lub:

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

Każda z nich spowoduje, że orzeczenie należy określać na każdej pozycji w zakresie ... ale przedtem, to wygrał w ogóle nie można go nazwać.

Jest rzeczą ważną, aby zrozumieć, ponieważ oznacza to, że resultsnie może być null zachowując funkcję oceny leniwe - dopóki nie próbował użytkuresults, że nie będzie pracował, czy to powinien być null lub nie!

+0

Zapomniałem o leniwej ocenie. * smacks self * – jasonh

+0

Zauważ, że "zapytanie", o którym mówisz, jest naprawdę niezliczone, które nie wypełniło danych ... – RCIX

2

Odwołanie do pustego IEnumerable<T>.

+0

Doskonale! Tego właśnie szukałem. Chciałem mieć pewność, że nie będę musiał sprawdzać wartości zerowej. – jasonh

+1

Nitpick: Odniesienie do pustego IEnumerable - nie do kolekcji –

+0

Tak, jesteś bezpieczny, to słodka dobroć! –

4

W takim przypadku zwraca wartość IEnumerable<Int32> z liczbą 0 elementów.

+4

To sprawia, że ​​brzmi to tak, jakby "wie", że jest liczba 0 - której nie ma. Zwrócona wartość to 'IEnumerable ', która po wykonaniu iteracji da 0 elementów. Nie wie to jednak wcześniej - musi wypróbować predykat przed każdą wartością, aby się tego dowiedzieć, i nie robi tego, dopóki tego nie poprosisz. –

+0

@Jon: zdecydowanie, dzięki za wyjaśnienie. Jak wspomniano w swoim poście, należy go wykorzystać do ustalenia wyniku. –

Powiązane problemy