Je suis un peu perdu dans la terre d'exécution différée:La réutilisation d'un IEnumerable <T> entraîne un résultat erroné, par ex. sur .Tout()
Je déclare une instance d'une classe implémentant IEnumerable
var wordEnumerable = new WordEnumerable(_text);
J'itérer sur (le premier mot est « Lorem ")
foreach (var word in wordEnumerable)
Console.WriteLine(word);
.. qui est écrit sur la console.
maintenant droit par la suite dans le code je fais un
Console.WriteLine(wordEnumerable.Any(w => w == "Lorem"));
.. et d'obtenir un faux en sortie.
Maintenant Si je mets la partie .Any (..) au-dessus de la boucle foreach, j'obtiens un vrai, cependant la boucle commence avec le second mot.
Mon attente était que .Net crée « contextes » exécution différent pour chaque appel à un IEnumerable et son IEnumerator sous-jacente afin qu'ils ne nuisent pas ... Je ne voudrais pas .Reset() la main afin d'obtenir un bon résultat?
Qu'est-ce qui me manque ici?
Mise à jour:
- Lien vers la mise en œuvre IEnumerable: https://gist.github.com/814352
- Lien vers la mise en œuvre IEnumerator: https://gist.github.com/814354
- .. et enfin la mise en œuvre de l'analyseur de texte sous-jacent: https://gist.github.com/814358
. C'est essentiellement un IEnumerable qui me permet de parcourir er les mots dans une chaîne donnée.
Comment 'WordEnumerable' implémente' IEnumerable '? –
Pourriez-vous nous fournir plus d'informations sur la classe WordEnumerable? Je n'ai aucun problème avec la création de fonctionnalités que vous souhaitez en utilisant simple 'Liste'. Et si la collection n'a pas été modifiée entre les deux fragments de code, alors votre code devrait également fonctionner, si la classe WordEnumerable fonctionne comme prévu. –
Pako
Allons-y, ajouté des liens vers des sources –