Question

  

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

Quelles sont les différences entre IEnumerator et IEnumerable?

Était-ce utile?

La solution

IEnumerable est une interface qui définit une méthode. GetEnumerator qui renvoie un IEnumerator , cela permet d'accéder 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 extrait de codebetter.com

Autres conseils

Un IEnumerator est une chose qui peut énumérer: il possède la propriété Current et les méthodes MoveNext et Reset (que vous n'appellerez probablement pas explicitement dans le code .NET dans le code .NET).

Un IEnumerable est une chose qui peut être énumérée ... ce qui signifie simplement qu'il a une méthode GetEnumerator qui retourne un IEnumerator<T>.

Lequel utilisez-vous? La seule raison d'utiliser Enumerator<T> est si vous avez quelque chose qui a une méthode non standard d'énumération (c'est-à-dire de retourner ses divers éléments un par un), et vous devez définir comment cela fonctionne. Vous créez une nouvelle classe implémentant List<T>. Mais vous devez toujours renvoyer cette Queue<T>, classe dans une Stack<T> classe.

Pour avoir une idée de ce à quoi ressemble un énumérateur (implémentant <=>), voyez toutes les classes <=>, telles que celles contenues dans <=>, <=> ou <=>. Pour un aperçu d'une classe implémentant <=>, consultez 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 se trouve à une certaine position (le 1er élément, le 7ème élément, etc.) et peut vous donner cet élément (IEnumerator.Current) ou passer à la suivante (IEnumerator.MoveNext). Lorsque vous écrivez une foreach boucle en C #, le compilateur génère un code utilisant un énumérateur.

Un Enumerable est une classe qui peut vous donner GetEnumerator s. Il a une méthode appelée <=> qui vous donne un <=> qui examine ses éléments. Lorsque vous écrivez une boucle <=> en C #, le code qu'il génère appelle <=> pour créer le <=> utilisé par la boucle.

IEnumerable et IEnumerator sont les deux interfaces. IEnumerable a juste une méthode appelée GetEnumerator. Cette méthode est relancée (toutes les méthodes renvoyant quelque chose, y compris void), un autre type, qui est une interface, et cette interface 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 a une seule méthode alors que IEnumerator a 2 méthodes (MoveNext et Reset) et une propriété Current. Pour faciliter la compréhension, considérons IEnumebale comme une boîte contenant IEnumerator (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();
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top