Чи може хтось пояснити, як відрізняються функції LINQ Де (..) та FindAll (..)? Вони, схоже, роблять те саме ...
Чи може хтось пояснити, як відрізняються функції LINQ Де (..) та FindAll (..)? Вони, схоже, роблять те саме ...
Відповіді:
FindAll()
це функція List<T>
типу, це не такий метод розширення LINQ Where
. Методи розширення LINQ працюють на будь-якому типі, який реалізується IEnumerable
, тоді як, FindAll
звичайно , вони можуть бути використані лише в List<T>
екземплярах (або екземплярах класів, які успадковують його).
Крім того, вони відрізняються фактичним призначенням. Where
повертає екземпляр, IEnumerable
який виконується на вимогу, коли об'єкт перераховується. FindAll
повертає нове, List<T>
що містить запитувані елементи. FindAll
більше схоже на дзвінок Where(...).ToList()
до екземпляра IEnumerable
.
Найбільша відмінність для мене полягає в тому, що .indAll також доступний у .Net 2.0. У мене не завжди є розкіш програмувати в .Net 3.5, тому я намагаюся запам’ятати «рідні» методи загальних колекцій .Net.
Кілька разів траплялося, що я сам реалізовував уже доступний метод List, оскільки не міг LINQ.
У цьому випадку я вважаю корисним те, що за допомогою VS2008 я можу використовувати умовивід і тип синтаксису лямбда. Це функції компілятора, а не рамкові функції. Це означає, що я можу це написати та все ще залишатись у .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Але якщо у вас є доступний LINQ, важливим є збереження різниці між відкладеним виконанням та негайним виконанням.
Якщо я пам'ятаю правильно, головна відмінність (окрім того, що вони реалізовані на: IEnumerable<T>
vs. List<T>
) полягає в тому, що вони Where
реалізують відкладене виконання, де воно фактично не здійснює пошук, поки вам це не потрібно - наприклад, використовуючи його в циклі foreach. FindAll
є методом негайного виконання.
Я зробив кілька тестів в списку 80K об'єктів і виявили , що Find()
може бути до 1000% швидше , ніж використання Where
з FirstOrDefault()
. Я не знав цього до тестування таймера до і після кожного дзвінка. Іноді це був той самий час, інший раз швидше.