Duplicate possible:
Quelqu'un peut-il m'expliquer IEnumerable et IEnumerator?
Quelles sont les différences entre IEnumerator et IEnumerable?
IEnumerable est une interface qui définit une méthode GetEnumerator qui renvoie un IEnumerator, ceci permet à son tour l’accès en lecture seule à une collection. Une collection qui implémente IEnumerable peut être utilisée avec une instruction foreach.
Définition
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
Un IEnumerator
est une chose qui peut énumérer: il a la propriété Current
et les méthodes MoveNext
et Reset
(que vous avez probablement gagnées dans le code .NET ' t appeler explicitement, bien que vous puissiez).
Un IEnumerable
est une chose qui peut être énumérée ... ce qui signifie simplement qu'il dispose d'une méthode GetEnumerator qui renvoie un IEnumerator
.
Lequel utilisez-vous? La seule raison d'utiliser IEnumerator
est que si vous avez quelque chose d'énumérant de manière non standard (c'est-à-dire de renvoyer ses divers éléments un par un), vous devez définir comment cela fonctionne. Vous créeriez une nouvelle classe implémentant IEnumerator
. Mais vous aurez toujours besoin de renvoyer cette IEnumerator
dans une classe IEnumerable
.
Pour un aperçu de ce qu’un énumérateur (implémentant IEnumerator<T>
) ressemble à, voir tout Enumerator<T>
classe, tels que ceux contenus dans List<T>
, Queue<T>,
ou Stack<T>
. Pour un aperçu d'une classe implémentant IEnumerable
, voyez n'importe quelle classe de collection standard.
Un Enumerator
vous montre les éléments d'une liste ou d'une collection. Chaque instance d'un énumérateur est à une certaine position (le 1er élément, le 7ème élément, etc.) et peut vous donner cet élément (IEnumerator.Current
) ou passer au suivant (IEnumerator.MoveNext
). Lorsque vous écrivez une boucle foreach
en C #, le compilateur génère un code utilisant un énumérateur.
Un Enumerable
est une classe qui peut vous donner Enumerator
s. Il a une méthode appelée GetEnumerator
qui vous donne un Enumerator
qui examine ses éléments. Lorsque vous écrivez une boucle foreach
en C #, le code qu'il génère appelle GetEnumerator
pour créer le Enumerator
utilisé par la boucle.
IEnumerable
et IEnumerator
sont les deux interfaces. IEnumerable
n'a qu'une méthode appelée GetEnumerator
. Cette méthode retourne (car toutes les méthodes renvoient quelque chose, y compris void) un autre type d’interface, qui est IEnumerator
. Lorsque vous implémentez la logique de l'énumérateur dans l'une de vos classes de collection, vous implémentez IEnumerable
(générique ou non générique). IEnumerable
n'a qu'une méthode alors que IEnumerator
a deux méthodes (MoveNext
et Reset
) et une propriété Current
. Pour faciliter la compréhension, considérons IEnumerable
comme une boîte contenant IEnumerator
à l'intérieur (mais pas par héritage ni par confinement). Voir le code pour une meilleure compréhension:
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}