2011-02-07 1 views
3

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:

. C'est essentiellement un IEnumerable qui me permet de parcourir er les mots dans une chaîne donnée.

+2

Comment 'WordEnumerable' implémente' IEnumerable '? –

+0

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

+0

Allons-y, ajouté des liens vers des sources –

Répondre

3

Votre attente est correcte - Any va appeler à nouveau GetEnumerator pour obtenir un nouveau IEnumerator<T>. Cela devrait être bien si vous avez implémenté correctement IEnumerable<T>. Ma conjecture est que votre implémentation de WordEnumerable est incorrecte. S'il vous plaît poster le code :)

Qu'est-ce qui se passe si vous écrivez:

Console.WriteLine("First"); 
foreach (var word in wordEnumerable) 
{ 
    Console.WriteLine(word); 
} 

Console.WriteLine("Second"); 
foreach (var word in wordEnumerable) 
{ 
    Console.WriteLine(word); 
} 

? L'autre chose à vérifier est que WordEnumerable implémente IEnumerable<string> plutôt que IEnumerable<object>, sinon votre vérification == sera une vérification d'identité de référence.

+0

Oh mon .. Merci Jon! Ma faute..J'ai réutilisé l'énumérateur :) C'est un IEnumerable , ainsi la comparaison == fonctionne très bien. –

Questions connexes