Duplicata possible :
Quelqu'un peut-il m'expliquer IEnumerable et IEnumerator ?
Quelles sont les différences entre IEnumerator et IEnumerable ?
Duplicata 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 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();
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.
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.
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 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.