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