LINQ, где () против FindAll () - PullRequest
       11

LINQ, где () против FindAll ()

110 голосов
/ 21 декабря 2009

Может кто-нибудь объяснить, как отличаются функции LINQ Где (..) и FindAll (..)? Кажется, они оба делают одно и то же ...

Ответы [ 4 ]

187 голосов
/ 21 декабря 2009

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

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

9 голосов
/ 21 декабря 2009

Самым большим отличием для меня является то, что .FindAll также доступен в .Net 2.0. У меня не всегда есть роскошь программировать на .Net 3.5, поэтому я стараюсь запомнить «родные» методы универсальных коллекций .Net.

Несколько раз случалось, что я сам реализовывал уже доступный метод List, потому что не мог связать его.

В этом случае мне удобно то, что при использовании VS2008 я могу использовать вывод типа и синтаксис лямбда-выражения. Это функции компилятора, а не фреймворка. Это означает, что я могу написать это и при этом оставаться в .Net 2.0:

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

Но если у вас есть LINQ, важно сохранять разницу между отложенным и немедленным выполнением.

5 голосов
/ 21 декабря 2009

Если я правильно помню, основное отличие (кроме того, на чем они реализованы: IEnumerable<T> против List<T>) состоит в том, что Where реализует отложенное выполнение, где он фактически не выполняет поиск, пока вам не понадобится это - использование его в цикле foreach, например. FindAll - это метод немедленного выполнения.

3 голосов
/ 02 ноября 2012

Я провел несколько тестов со списком объектов размером 80К и обнаружил, что Find() может быть на 1000% быстрее, чем при использовании Where с FirstOrDefault(). Я не знал этого до тестирования таймера до и после каждого звонка. Иногда это было в то же время, а иногда быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...