Quiero obtener una diferencia entre los métodos take while y where LINQ. Obtuve los siguientes datos de MSDN. Pero no tenía sentido para mí
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Filtra una secuencia de valores basada en un predicado.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Devuelve elementos de una secuencia siempre que una condición especificada sea verdadera.
Todas las opiniones son bienvenidas.
Respuestas:
TakeWhile se detiene cuando la condición es falsa, Where continúa y encuentra todos los elementos que coinciden con la condición
Da
fuente
Where
Puede examinar toda la secuencia en busca de coincidencias.TakeWhile
deja de mirar cuando encuentra la primera no coincidencia.fuente
Digamos que tiene una matriz que contiene
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Ahora:var whereTest = array.Where(i => i <= 5);
volverá[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
volverá[1, 3, 5]
.fuente
MSDN dice
Enumerable.TakeWhile Method
Enumerable.Where
La diferencia es que
Enumerable.TakeWhile
omite los elementos restantes de la primera no coincidencia, ya sea que coincidan con la condición o nofuente
Si bien las respuestas existentes son correctas, ninguna de ellas indica por qué querría usar TakeWhile si los resultados fueran los mismos: Rendimiento. Suponga que tiene una lista ordenada con 2 mil millones de elementos y desea los que (probablemente 10 o 15 elementos) sean menores que un valor determinado. La cláusula Where examinará los 2 mil millones de elementos, mientras que TakeWhile se detendrá tan pronto como encuentre un valor igual o mayor que el valor proporcionado
fuente
El orden de la secuencia pasada es absolutamente crítico con
TakeWhile
, que terminará tan pronto como regrese un predicadofalse
, mientrasWhere
que continuará evaluando la secuencia más allá del primerfalse
valor.Un uso común de
TakeWhile
es durante la evaluación perezosa de enumerables grandes, costosos o incluso infinitos, donde puede tener conocimiento adicional sobre el orden de la secuencia.por ejemplo, dada la secuencia:
A
.Where
resultará en un bucle infinito que intenta evaluar parte del enumerable:Mientras que a
.TakeWhile
, y armado con el conocimiento de que los enumerables es ascendente, permitirá evaluar la secuencia parcial:fuente