LINQ est SkipWhile cassé?
Je suis un peu surpris de trouver les résultats de le code suivant, où je veux simplement supprimer toutes les 3s à partir d'une séquence d'entiers:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); //Oh noes! Returns { 1, 1, 2, 3 }
Pourquoi ce n'est pas 3 ignorés?
Ma prochaine pensée a été, OK, à l'Exception de l'opérateur fera l'affaire:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.Except(i => i == 3); //Oh noes! Returns { 1, 2 }
En résumé,
- Sauf supprime les 3, mais aussi
supprime non-éléments distincts. Grr. - SkipWhile ne saute pas la dernière
élément, même si elle correspond à l'
condition. Grr.
Quelqu'un peut m'expliquer pourquoi SkipWhile ne pas sauter le dernier élément? Et quelqu'un peut-il suggérer des opérateurs LINQ je peux utiliser pour supprimer le '3' de la séquence ci-dessus?
- Il pense que SkipWhile(true). donc, votre première condition (i==3) échoue. il devient donc de SkipWhile(faux) et donc ce qui se passe ensuite ? Elle retourne tous les éléments restants!
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas rompu.
SkipWhile
ne passez éléments dans le début de laIEnumerable<T>
. Une fois cette condition n'est pas remplie, il sera heureux de prendre le reste des éléments. D'autres éléments qui, plus tard correspondance en bas de la route ne sera pas ignorée.{3,1,2,3}
. Le résultat souhaité est de filtrer toutes les 3s, qui est ce queWhere
est pour.La SkipWhile et TakeWhile opérateurs de sauter ou de retourner des éléments à partir d'une séquence tandis qu'une fonction de prédicat passe (renvoie true (Vrai). Le premier élément qui ne passe pas la fonction de prédicat se termine le processus de l'évaluation.
//Contourne éléments dans une séquence tant qu'une condition spécifiée est vraie et renvoie les éléments restants.
Une solution que vous pouvez trouver utile est en utilisant la Liste des "FindAll" de la fonction.
Ahmad déjà répondu à votre question, mais voici une autre possibilité: