web-dev-qa-db-fra.com

Quelle est la différence entre IEnumerator et IEnumerable?

Duplicate possible:
Quelqu'un peut-il m'expliquer IEnumerable et IEnumerator?

Quelles sont les différences entre IEnumerator et IEnumerable?

95
Shaun

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();

exemple de code de codebetter.com

107
cgreeno

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.

65
Ryan Lundy

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 Enumerators. 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.

15
SLaks

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();
    }
}
9
James Kingsbery