LINQ, Where() vs FindAll()

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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