123 votes

LINQ où vs takewhile

Je veux recevoir une différence entre takewhile et où les méthodes LINQ .J'ai obtenu les données suivantes à partir de MSDN .Mais Elle n'a pas de sens pour moi

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

Les filtres d'une séquence de valeurs en fonction d'un prédicat.

TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

Renvoie les éléments d'une séquence tant qu'une condition est vraie.

Toutes les opinions sont les bienvenues.

203voto

Albin Sunnanbo Points 30722

TakeWhile s'arrête lorsque la condition est fausse, Où se poursuit et trouver tous les éléments correspondant à la condition

var intList = new int[] { 1, 2, 3, 4, 5, -1, -2 };
Console.WriteLine("Where");
foreach (var i in intList.Where(x => x <= 3))
    Console.WriteLine(i);
Console.WriteLine("TakeWhile");
foreach (var i in intList.TakeWhile(x => x <= 3))
    Console.WriteLine(i);

Donne

Where
1
2
3
-1
-2
TakeWhile
1
2
3

39voto

David B Points 53123

Where peut examiner l'ensemble de la séquence à la recherche pour les matchs.

Enumerable.Range(1, 10).Where(x => x % 2 == 1)
// 1, 3, 5, 7, 9

TakeWhile s'arrête à la recherche lors de la rencontre avec le premier non-match.

Enumerable.Range(1, 10).TakeWhile(x => x % 2 == 1)
// 1

10voto

Jim Mischel Points 68586

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); sera de retour [1, 3, 5, 0, 2, 4].

var whileTest = array.TakeWhile(i => i <= 5); sera de retour [1, 3, 5].

10voto

naveen Points 21236

MSDN dit

Enumerable.TakeWhile Method

Renvoie les éléments d'une séquence long comme une condition spécifiée est vraie, et puis saute sur les éléments restants.

Enumerable.Where

Les filtres d'une séquence de valeurs basée sur un prédicat.

La différence est que, Enumerable.TakeWhile ignore les éléments restants de la première non-match, si elles correspondent à l'état ou pas

8voto

StuartLC Points 35534

Une utilisation courante de TakeWhile est au cours de l'évaluation différée de grande taille, coûteux, ou même infini enumerables où vous pouvez avoir des connaissances supplémentaires sur la commande de la séquence.

par exemple, compte tenu de la séquence:

IEnumerable<BigInteger> InfiniteSequence()
{
    BigInteger sequence = 0;
    while (true)
    {
        yield return sequence++;
    }
}

Un .Where entraînera dans une boucle infinie en essayant d'évaluer une partie de l'énumération:

var result = InfiniteSequence()
    .Where(n => n < 100)
    .Count();

Alors qu'un .TakeWhile, et armé avec la connaissance que le enumerables est croissant, permettra à la séquence partielle doit être évaluée:

var result = InfiniteSequence()
    .TakeWhile(n => n < 100)
    .Count();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X