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