Eu quero obter uma diferença entre takewhile e onde os métodos LINQ. Eu obtive os seguintes dados do MSDN .Mas não fazia sentido para mim
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Filtra uma sequência de valores com base em um predicado.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Retorna elementos de uma sequência, desde que uma condição especificada seja verdadeira.
Todas as opiniões são bem-vindas.
Respostas:
TakeWhile para quando a condição é falsa, onde continua e encontra todos os elementos que correspondem à condição
Dá
fonte
Where
pode examinar toda a sequência em busca de correspondências.TakeWhile
para de procurar quando encontra a primeira não correspondência.fonte
Digamos que você tenha uma matriz que contém
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Agora:var whereTest = array.Where(i => i <= 5);
vai voltar[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
vai voltar[1, 3, 5]
.fonte
MSDN diz
Enumerable.TakeWhile Method
Enumerable.Where
A diferença é que
Enumerable.TakeWhile
pula os elementos restantes do primeiro não coincide, quer eles correspondam à condição ou nãofonte
Embora as respostas existentes estejam corretas, nenhuma delas indica por que você deseja usar TakeWhile se os resultados forem os mesmos: Desempenho. Suponha que você tenha uma lista ordenada com 2 bilhões de itens e deseja aqueles que (provavelmente 10 ou 15 itens) têm menos do que um determinado valor. A cláusula Where examinará todos os 2 bilhões de itens, enquanto o TakeWhile irá parar assim que encontrar um valor igual ou superior ao seu valor fornecido
fonte
A ordem da sequência passada é absolutamente crítica com
TakeWhile
, que terminará assim que um predicado retornarfalse
, enquantoWhere
que continuará a avaliar a sequência além do primeirofalse
valor.Um uso comum de
TakeWhile
é durante a avaliação preguiçosa de enumeráveis grandes, caros ou até infinitos, onde você pode ter conhecimento adicional sobre a ordem da sequência.por exemplo, dada a sequência:
A
.Where
resultará em um loop infinito tentando avaliar parte do enumerável:Considerando que a
.TakeWhile
, e munido do conhecimento de que os enumeráveis são ascendentes, permitirá que a sequência parcial seja avaliada:fonte