Может кто-нибудь объяснить, чем отличаются функции LINQ Where (..) и FindAll (..)? Кажется, они оба делают одно и то же ...
Может кто-нибудь объяснить, чем отличаются функции LINQ Where (..) и FindAll (..)? Кажется, они оба делают одно и то же ...
Ответы:
FindAll()
- это функция List<T>
типа, а не метод расширения LINQ, например Where
. Методы расширения LINQ работают с любым типом, который реализует IEnumerable
, тогда как FindAll
могут использоваться только с List<T>
экземплярами (или, конечно, с экземплярами классов, которые наследуются от него).
Кроме того, они различаются по собственному назначению. Where
возвращает экземпляр, IEnumerable
который выполняется по запросу при перечислении объекта. FindAll
возвращает новый List<T>
, содержащий запрошенные элементы. FindAll
больше похоже на вызов Where(...).ToList()
экземпляра IEnumerable
.
Самая большая разница для меня в том, что .FindAll также доступен в .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()
. Я не знал этого, пока не тестировал таймер до и после каждого звонка. Иногда было в одно и то же время, иногда быстрее.