Що LINQ повертає, коли результати порожні


319

У мене питання щодо запиту LINQ. Зазвичай запит повертає IEnumerable<T>тип. Якщо повернення порожнє, не переконайтеся, що воно є нульовим чи ні. Я не впевнений, що наступне ToList()викине виняток або просто порожній, List<string>якщо в 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();

Я знаю, що це дуже просте питання, але на даний момент у мене немає VS.


11
Я здогадуюсь результат - Численні. Порожні?
David.Chu.ca

Відповіді:


512

Це поверне порожній перелік. Це не буде нульовим. Ви можете спати звук :)


38

Ви також можете перевірити .Any()метод:

if (!YourResult.Any())

Просто примітка, яка .Anyвсе одно витягує записи з бази даних; виконання .FirstOrDefault()/.Where()заповіту буде настільки ж накладним, але ви зможете спіймати об'єкти, повернуті з запиту


5
Де запитання згадує базу даних?
cja

4
Вам доведеться запитати того, хто редагував, я не згадував жодної БД :)
Noich

Точковий редактор створює звук, однак, БД чи ні. Я вважаю, що вони говорять .Any()- це просто повідомить вам, чи є у вас взагалі відповідні записи, де виконання запиту на пошук конкретного значення може бути нульовим, коли .Any()його немає.
vapcguy

1
Редагування насправді може бути неправильним. Якщо ви використовуєте linq для сутностей, db може це зробити ярликом, і клієнтові дані взагалі не надсилаються, окрім правдивої чи неправдивої
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

(Дамп - від LinqPad )


Саме так! Ви отримаєте кращу вказівку на результати дослідження
зафіксували

TIL Count()- це також метод, не тільки властивість
heyNow

2
Чи не слід використовувати .Any (), оскільки кількість буде перерахована через усі елементи?
SHEePYTaGGeRNeP


8

У Linq-to-SQL, якщо ви спробуєте отримати перший елемент запиту без результатів, ви отримаєте sequence contains no elementsпомилку. Можу запевнити, що згадана помилка не дорівнює object reference not set to an instance of an object. у висновку ні, він не поверне нульове значення, оскільки null не може сказати, sequence contains no elementsщо завжди буде говорити object reference not set to an instance of an object;)


1
О, ваше пояснення сприяє подальшому розумінню. Дякую !
Кей Лі

Чи відповідає це на питання?
ChiefTwoPencils

7

Інші публікації тут дають зрозуміти, що результат - "порожній" IQueryable, який ToList () буде коректно змінено на порожній список тощо.

Будьте обережні з деякими операторами, оскільки вони викинуть, якщо ви надішлете їм порожній номер. Це може статися, коли ви з'єднаєте їх разом.


3
"Будьте обережні з деякими операторами, тому що вони будуть кидати, якщо ви надішлите їм порожній перелік, це може статися, коли ви з'єднаєте їх разом". - Це те, що отримало мене. У мене було нульове повернене значення, яке я потім подав в інший запит. Це призвело до того, що другий запит кидає незалежно від того, до чого я його передав, оскільки значення другого запиту не було подано.
trevorc

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.