Quelqu'un peut-il expliquer IEnumerable et IEnumerator pour moi ?
par exemple, quand l’utiliser sur foreach ? Quelle est la différence entre IEnumerable et IEnumerator ? Pourquoi avons-nous besoin de l’utiliser ?
Quelqu'un peut-il expliquer IEnumerable et IEnumerator pour moi ?
par exemple, quand l’utiliser sur foreach ? Quelle est la différence entre IEnumerable et IEnumerator ? Pourquoi avons-nous besoin de l’utiliser ?
par exemple, lorsque l'utiliser sur foreach?
Vous n'utilisez pas l'
IEnumerable
"plus"foreach
. La mise en œuvre deIEnumerable
fait à l'aide d'foreach
possible.Lorsque vous écrivez du code comme:
foreach (Foo bar in baz) { ... }
il est fonctionnellement équivalent à l'écriture:
IEnumerator bat = baz.GetEnumerator(); while (bat.MoveNext()) { bar = (Foo)bat.Current ... }
Par "fonctionnellement équivalent," je veux dire que c'est effectivement ce que le compilateur transforme le code en. Vous ne pouvez pas utiliser
foreach
surbaz
dans cet exemple, à moins d'baz
implémenteIEnumerable
.
IEnumerable
signifie qu'baz
implémente la méthodeIEnumerator GetEnumerator()
L'
IEnumerator
objet que cette méthode retourne doivent mettre en œuvre les méthodesbool MoveNext()
et
Object Current()
La première méthode avances à l'objet suivant dans l'
IEnumerable
objet qui a créé l'agent recenseur, de revenirfalse
si c'est fait, et la seconde renvoie à l'objet courant.Rien dans .Net que vous pouvez parcourir implémente
IEnumerable
. Si vous êtes à la construction de votre propre classe, et il n'a pas déjà hériter d'une classe qui implémenteIEnumerable
, vous pouvez faire de votre classe utilisable enforeach
consolidés par la mise en œuvre deIEnumerable
(et par la création d'un énumérateur de classe que son nouveauGetEnumerator
méthode sera de retour).
IEnumerable implémente GetEnumerator. Lorsqu'elle est appelée, la méthode renverra une IEnumerator qui implémente la méthode MoveNext, de Réinitialisation et de Courant.
Ainsi, lorsque votre classe implémentant IEnumerable, vous dites que vous pouvez appeler une méthode (GetEnumerator) et d'obtenir un nouvel objet renvoyé (un IEnumerator) vous pouvez utiliser dans une boucle comme foreach.
La mise en œuvre de IEnumerable vous permet d'obtenir un IEnumerator pour une liste.
IEnumerator permet foreach style de l'accès séquentiel aux éléments de la liste, en utilisant le mot clé yield.
Avant le foreach de mise en œuvre (dans Java 1.4, par exemple), le moyen pour parcourir une liste a été d'obtenir un agent recenseur de la liste, puis lui demander pour l'élément "suivant" dans la liste, aussi longtemps que la valeur retournée comme l'élément suivant n'est pas nulle. Foreach simplement le fait implicitement comme un langage, de la même manière que lock() implémente la classe Monitor derrière les coulisses.
J'attends foreach fonctionne sur les listes parce qu'ils implémentent l'interface IEnumerable.
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.