346 votes

Quelqu'un peut-il expliquer IEnumerable et IEnumerator pour moi ?

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 ?

336voto

Robert Rossney Points 43767

par exemple, lorsque l'utiliser sur foreach?

Vous n'utilisez pas l' IEnumerable "plus" foreach. La mise en œuvre de IEnumerable 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 sur baz dans cet exemple, à moins d' baz implémente IEnumerable.

IEnumerable signifie qu' baz implémente la méthode

IEnumerator GetEnumerator()

L' IEnumerator objet que cette méthode retourne doivent mettre en œuvre les méthodes

bool MoveNext()

et

Object Current()

La première méthode avances à l'objet suivant dans l' IEnumerable objet qui a créé l'agent recenseur, de revenir false 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émente IEnumerable, vous pouvez faire de votre classe utilisable en foreach consolidés par la mise en œuvre de IEnumerable (et par la création d'un énumérateur de classe que son nouveau GetEnumerator méthode sera de retour).

71voto

Chris Points 8576

Hériter de IEnumerable moyens votre classe retourne un objet IEnumerator :

Héritant de IEnumerator moyens votre classe retourne les méthodes et propriétés pour itération :

C’est la différence de toute façon.

25voto

DavGarcia Points 9322

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.

18voto

Neil Barnwell Points 20731

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.

18voto

Lieven Keersmaekers Points 32396

Objet implémentant IEnumerable permet d’autres visité chacun des ses propres éléments via un énumérateur. Un objet qui implémente IEnumerator est le fait de l’itération. C’est une boucle au-dessus d’un objet énumérable.

Pensez à des objets énumérables à partir de listes, piles, arbres.

Prograide.com

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.

Powered by:

X