115 votes

Quelle est la différence entre IEnumerator et IEnumerable ?

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

Quelles sont les différences entre IEnumerator et IEnumerable ?

125voto

cgreeno Points 17379

IEnumerable est une interface qui définit une méthode GetEnumerator qui renvoie un IEnumerator qui, à son tour, permet un 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 provenant de codebetter.com

74voto

Kyralessa Points 76456

Un site IEnumerator est une chose qui peut énumérer : elle a la fonction Current et le MoveNext y Reset (que vous n'appellerez probablement pas explicitement dans le code .NET, bien que vous puissiez le faire).

Un site IEnumerable est une chose qui peut être énumérée... ce qui signifie simplement qu'elle a une méthode GetEnumerator qui renvoie un IEnumerator .

Lequel utilisez-vous ? La seule raison d'utiliser IEnumerator c'est si vous avez quelque chose qui a une façon non standard d'énumérer (c'est-à-dire, de retourner ses différents éléments un par un), et vous devez définir comment cela fonctionne. Vous créerez une nouvelle classe implémentant IEnumerator . Mais vous devrez quand même retourner ce IEnumerator dans un IEnumerable classe.

Pour un aperçu de ce qu'est un énumérateur (implémentant IEnumerator<T> ) ressemble, voir n'importe quel Enumerator<T> tels que ceux contenus dans List<T> , Queue<T>, o Stack<T> . Pour un aperçu d'une classe implémentant IEnumerable voir toute classe de collection standard.

20voto

SLaks Points 391154

Un site Enumerator vous montre les éléments d'une liste ou d'une collection. Chaque instance d'un Enumerator se trouve à une certaine position (le 1er élément, le 7e élément, etc.) et peut vous donner cet élément ( IEnumerator.Current ) ou passer au suivant ( IEnumerator.MoveNext ). Lorsque vous écrivez un foreach en C#, le compilateur génère du code qui utilise un Enumerator.

Un site Enumerable est un cours qui peut vous donner Enumerator s. Il possède une méthode appelée GetEnumerator qui vous donne un Enumerator qui regarde ses articles. Lorsque vous écrivez un foreach en C#, le code qu'il génère appelle GetEnumerator pour créer le Enumerator utilisé par la boucle.

12voto

James Kingsbery Points 3460

IEnumerable y IEnumerator sont toutes deux des interfaces. IEnumerable n'a qu'une seule méthode appelée GetEnumerator . Cette méthode renvoie (comme toutes les méthodes qui renvoient quelque chose, y compris void) un autre type qui est une interface et cette interface est IEnumerator . Lorsque vous implémentez la logique d'énumération dans une de vos classes de collection, vous implémentez la logique d'énumération dans la classe de collection. IEnumerable (qu'ils soient génériques ou non). IEnumerable n'a qu'une seule méthode alors que IEnumerator a 2 méthodes ( MoveNext y Reset ) et une propriété Current . Pour une meilleure compréhension, considérez IEnumerable comme une boîte qui contient IEnumerator à l'intérieur de celui-ci (mais pas par héritage ou 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();
    }
}

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