Alguém pode explicar como as funções LINQ Onde (..) e FindAll (..) diferem? Ambos parecem fazer a mesma coisa ...
Alguém pode explicar como as funções LINQ Onde (..) e FindAll (..) diferem? Ambos parecem fazer a mesma coisa ...
Respostas:
FindAll()
é uma função do List<T>
tipo, não é como um método de extensão LINQ Where
. Os métodos de extensão LINQ funcionam em qualquer tipo que implemente IEnumerable
, enquanto que FindAll
só podem ser usados em List<T>
instâncias (ou instâncias de classes que herdam dela, é claro).
Além disso, eles diferem na finalidade real. Where
retorna uma instância IEnumerable
executada sob demanda quando o objeto é enumerado. FindAll
retorna um novo List<T>
que contém os elementos solicitados. FindAll
é mais como chamar Where(...).ToList()
uma instância de IEnumerable
.
A maior diferença para mim é que .FindAll também está disponível no .Net 2.0. Nem sempre tenho o luxo de programar no .Net 3.5, por isso tento me lembrar dos métodos 'nativos' das coleções genéricas .Net.
Aconteceu várias vezes que eu implementei um método List já disponível porque não consegui LINQ.
O que acho útil nesse caso é que, usando o VS2008, posso usar a inferência de tipo e a sintaxe lambda. Esses são recursos do compilador, e não da estrutura. Isso significa que eu posso escrever isso e ainda permanecer no .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Mas se você tiver o LINQ disponível, é importante manter a diferença entre execução adiada e execução imediata.
Fiz alguns testes em uma lista de objetos de 80K e descobri que Find()
pode ser até 1000% mais rápido do que usar um Where
com FirstOrDefault()
. Eu não sabia disso até testar um cronômetro antes e depois de cada chamada. Às vezes era a mesma hora, outras vezes era mais rápido.