¿Alguien puede explicar cómo funciona LINQ Donde (..) y FindAll (..) difieren? Ambos parecen hacer lo mismo ...
¿Alguien puede explicar cómo funciona LINQ Donde (..) y FindAll (..) difieren? Ambos parecen hacer lo mismo ...
Respuestas:
FindAll()
es una función en el List<T>
tipo, no es un método de extensión LINQ como Where
. Los métodos de extensión LINQ funcionan en cualquier tipo que implemente IEnumerable
, mientras FindAll
que solo pueden usarse en List<T>
instancias (o instancias de clases que heredan de él, por supuesto).
Además, difieren en su propósito real. Where
devuelve una instancia de IEnumerable
que se ejecuta bajo demanda cuando se enumera el objeto. FindAll
devuelve un nuevo List<T>
que contiene los elementos solicitados. FindAll
es más como llamar Where(...).ToList()
a una instancia de IEnumerable
.
La mayor diferencia para mí es que .FindAll también está disponible en .Net 2.0. No siempre tengo el lujo de programar en .Net 3.5, así que trato de recordar los métodos 'nativos' de las colecciones genéricas .Net.
Sucedió varias veces que implementé un método de Lista ya disponible porque no pude LINQ.
Lo que encuentro útil en este caso es que, usando VS2008, puedo usar la inferencia de tipos y la sintaxis lambda. Estas son características del compilador, no características del marco. Esto significa que puedo escribir esto y aún permanecer dentro de .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Pero si tiene LINQ disponible, es importante mantener la diferencia entre la ejecución diferida y la ejecución inmediata.
Si recuerdo correctamente, la principal diferencia (además de en qué están implementados: IEnumerable<T>
vs. List<T>
) es que Where
implementa la ejecución diferida, donde en realidad no realiza la búsqueda hasta que la necesite, usándola en un bucle foreach, por ejemplo. FindAll
Es un método de ejecución inmediata.
Hice algunas pruebas en una lista de objetos de 80K y descubrí que Find()
puede ser hasta un 1000% más rápido que usar un Where
con FirstOrDefault()
. No lo supe hasta que probé un temporizador antes y después de cada llamada. A veces era al mismo tiempo, otras veces era más rápido.