Quand dois-je utiliser IEnumerator pour faire des boucles en c#?
Je me demandais s'il y a des fois où il est avantageux d'utiliser un IEnumerator sur une boucle foreach pour parcourir en une collection? Par exemple, est-il un moment où il serait préférable d'utiliser des exemples de code suivants sur les autres?
IEnumerator<MyClass> classesEnum = myClasses.GetEnumerator();
while(classesEnum.MoveNext())
Console.WriteLine(classesEnum.Current);
au lieu de
foreach (var class in myClasses)
Console.WriteLine(class);
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, notez qu'une grande différence dans votre exemple (entre
foreach
etGetEnumerator
), c'est queforeach
garanties pour appelerDispose()
sur l'itérateur si l'itérateur estIDisposable
. C'est important pour beaucoup d'itérateurs (qui pourrait être de consommer une alimentation de données externes, par exemple).En fait, il y a des cas où
foreach
n'est pas aussi utiles que nous le souhaiterions.Tout d'abord, il est le "premier élément" cas discuté ici (foreach /détection de la première itération).
Mais plus; si vous essayez d'écrire le manque
Zip
méthode pour la couture de deux énumérable les séquences (ou leSequenceEqual
méthode), vous trouverez que vous pouvez utiliserforeach
sur les deux séquences, car ce serait d'effectuer un cross-jointure. Vous devez utiliser l'itérateur directement pour l'un d'entre eux:Selon la Langage C# spec:
L'essence de vos deux exemples sont les mêmes, mais il ya quelques différences importantes, notamment la
try
/finally
.En C#,
foreach
est en train de faire exactement la même chose que leIEnumerator
code que vous avez posté ci-dessus. Leforeach
construction est prévue pour le rendre plus facile pour le programmeur. Je crois qu'IL a généré dans les deux cas est le même.Je l'ai utilisé parfois lors de la première itération de faire quelque chose de différent des autres.
Par exemple, si vous souhaitez imprimer les membres de la console et des résultats séparés par la ligne, que vous pouvez écrire.
Alors le résultat est
Et dans une autre situation, c'est quand je itération 2 agents recenseurs ensemble.
résultat
À l'aide de agent recenseur vous permet de ne plus flexible sur vos itération. Mais dans la plupart des cas, vous pouvez utiliser foreach