Quelle est la différence entre IEnumerator et IEnumerable? [dupliquer]
-
03-07-2019 - |
Question
Double possible:
Quelqu'un peut-il m'expliquer IEnumerable et IEnumerator?
Quelles sont les différences entre IEnumerator et IEnumerable?
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();
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();
}
}