LINQ, де () - FindAll ()


125

Чи може хтось пояснити, як відрізняються функції LINQ Де (..) та FindAll (..)? Вони, схоже, роблять те саме ...



Відповіді:


203

FindAll()це функція List<T>типу, це не такий метод розширення LINQ Where. Методи розширення LINQ працюють на будь-якому типі, який реалізується IEnumerable, тоді як, FindAllзвичайно , вони можуть бути використані лише в List<T>екземплярах (або екземплярах класів, які успадковують його).

Крім того, вони відрізняються фактичним призначенням. Whereповертає екземпляр, IEnumerableякий виконується на вимогу, коли об'єкт перераховується. FindAllповертає нове, List<T>що містить запитувані елементи. FindAllбільше схоже на дзвінок Where(...).ToList()до екземпляра IEnumerable.


20
Так, де ледача версія findall
Pierreten

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95 пояснює відмінності між ледачим (відкладеним) та негайним виконанням. В основному, в деяких випадках вам не потрібен весь список, ви можете переглядати елементи, поки щось не відбудеться, а потім зупинити. Ось тут корисний лінивий, але залежно від впровадження може призвести до непередбачуваних результатів (все пояснено у посиланні). Сподіваюся, це допомагає.
nurchi

10

Найбільша відмінність для мене полягає в тому, що .indAll також доступний у .Net 2.0. У мене не завжди є розкіш програмувати в .Net 3.5, тому я намагаюся запам’ятати «рідні» методи загальних колекцій .Net.

Кілька разів траплялося, що я сам реалізовував уже доступний метод List, оскільки не міг LINQ.

У цьому випадку я вважаю корисним те, що за допомогою VS2008 я можу використовувати умовивід і тип синтаксису лямбда. Це функції компілятора, а не рамкові функції. Це означає, що я можу це написати та все ще залишатись у .Net 2.0:

var myOddNums = myNums.FindAll(n => n%2==1);

Але якщо у вас є доступний LINQ, важливим є збереження різниці між відкладеним виконанням та негайним виконанням.


6

Якщо я пам'ятаю правильно, головна відмінність (окрім того, що вони реалізовані на: IEnumerable<T>vs. List<T>) полягає в тому, що вони Whereреалізують відкладене виконання, де воно фактично не здійснює пошук, поки вам це не потрібно - наприклад, використовуючи його в циклі foreach. FindAllє методом негайного виконання.


3

Я зробив кілька тестів в списку 80K об'єктів і виявили , що Find()може бути до 1000% швидше , ніж використання Whereз FirstOrDefault(). Я не знав цього до тестування таймера до і після кожного дзвінка. Іноді це був той самий час, інший раз швидше.


5
Ви також спробували отримати доступ до колекції? Enumerable.Where () використовує відкладене виконання і не отримує оцінку до доступу до колекції, що може призвести до помилкових уявлень про те, чи є насправді швидше чи ні. Однак, здебільшого, це швидше використання перелічених чисел, а не статичних колекцій (наприклад, Type <T> і Array <T>).
Себастьян Робота Bjørnager Jensen

Питання стосується FindAll. Очевидно, що пошук стане швидше, ніж де (з урахуванням усіх значень) та отримання FirstOrDefault
Vivek MVK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.