Может кто-нибудь объяснить, чем отличаются функции 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(). Я не знал этого, пока не тестировал таймер до и после каждого звонка. Иногда было в одно и то же время, иногда быстрее.