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
WherePuede examinar toda la secuencia en busca de coincidencias.TakeWhiledeja 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 MethodEnumerable.WhereLa diferencia es que
Enumerable.TakeWhileomite 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, mientrasWhereque continuará evaluando la secuencia más allá del primerfalsevalor.Un uso común de
TakeWhilees 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
.Whereresultará 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