Je veux faire la différence entre les méthodes take while et where LINQ. J'ai obtenu les données suivantes de MSDN. Mais cela n'a pas de sens pour moi
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Filtre une séquence de valeurs basée sur un prédicat.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Renvoie des éléments d'une séquence tant qu'une condition spécifiée est vraie.
Toutes les opinions sont les bienvenues.
Réponses:
TakeWhile s'arrête lorsque la condition est fausse, Where continue et trouve tous les éléments correspondant à la condition
Donne
la source
Where
peut examiner toute la séquence à la recherche de correspondances.TakeWhile
arrête de regarder quand il rencontre le premier non-match.la source
Disons que vous avez un tableau qui contient
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Maintenant:var whereTest = array.Where(i => i <= 5);
reviendra[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
reviendra[1, 3, 5]
.la source
MSDN dit
Enumerable.TakeWhile Method
Enumerable.Where
La différence est que
Enumerable.TakeWhile
ignore les éléments restants de la première non-correspondance, qu'ils correspondent ou non à la conditionla source
Bien que les réponses existantes soient correctes, aucune d'entre elles n'indique pourquoi vous voudriez utiliser TakeWhile si les résultats seraient les mêmes: Performance. Supposons que vous ayez une liste ordonnée contenant 2 milliards d'éléments et que vous souhaitiez ceux qui (probablement 10 ou 15 éléments) sont inférieurs à une valeur donnée. La clause Where examinera les 2 milliards d'articles, tandis que TakeWhile s'arrêtera dès qu'il trouvera une valeur égale ou supérieure à la valeur fournie
la source
L'ordre de la séquence passée est absolument critique avec
TakeWhile
, qui se terminera dès le retour d'un prédicatfalse
, alors queWhere
continuera à évaluer la séquence au-delà de la premièrefalse
valeur.Une utilisation courante de
TakeWhile
est lors de l'évaluation paresseuse d'énumérables volumineux, coûteux ou même infinis où vous pouvez avoir des connaissances supplémentaires sur l'ordre de la séquence.Par exemple, étant donné la séquence:
A
.Where
entraînera une boucle infinie essayant d'évaluer une partie de l'énumérable:Alors que a
.TakeWhile
, et armé de la connaissance que les énumérables sont ascendants, permettra d'évaluer la séquence partielle:la source