Результаты LINQ, когда нет совпадений? - PullRequest
8 голосов
/ 07 октября 2009

Что именно возвращает функция LINQ при отсутствии совпадений? Возьмите метод Где, например:

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

Что будет в результатах на данный момент?

Ответы [ 3 ]

10 голосов
/ 07 октября 2009

results сам по себе просто запрос. Пока вы не начнете перебирать его (явно или через вызов типа Count()), ничто не проверяет, есть ли результаты или нет. Только когда вы перечислите это, что-нибудь случится.

Чтобы вы могли сделать:

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

Или:

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

Любое из них приведет к оценке предиката для каждого элемента в диапазоне ... но до этого он вообще не будет вызываться.

Это важная вещь для понимания, потому что это означает, что results не может быть null при сохранении функции отложенной оценки - пока вы не попытаетесь использовать results, это не сработало бы, должно ли это быть null или нет!

4 голосов
/ 07 октября 2009

В этом случае возвращается IEnumerable<Int32> с количеством элементов 0.

3 голосов
/ 07 октября 2009

Ссылка на пустое IEnumerable<T>.

...