Possible en double:
Can anyone explain IEnumerable and IEnumerator to me?Quelle est la différence entre IEnumerator et IEnumerable?
Quelles sont les différences entre IEnumerator et IEnumerable?
Possible en double:
Can anyone explain IEnumerable and IEnumerator to me?Quelle est la différence entre IEnumerator et IEnumerable?
Quelles sont les différences entre IEnumerator et IEnumerable?
IEnumerable est une interface qui définit une méthode GetEnumerator qui retourne une interface IEnumerator, à 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();
@Rex M: Je pense que le code a du sens. IEnumerable a une méthode GetEnumerator qui retourne un IEnumer * ator *, pas IEnumer * able *. – Lernkurve
@Lernkurve la réponse a été modifiée pour être correcte après avoir posté mon commentaire. –
IEnumerable et IEnumerator sont les deux interfaces. IEnumerable a juste une méthode appelée GetEnumerator. Cette méthode se termine (car toutes les méthodes retournent quelque chose incluant void) un autre type qui est une interface et cette interface est IEnumerator. Lorsque vous implémentez la logique d'énumérateur dans n'importe quelle classe de collection, vous implémentez IEnumerable (générique ou non générique). IEnumerable a juste une méthode alors que IEnumerator a 2 méthodes (MoveNext et Reset) et une propriété Current. Pour faciliter la compréhension, considérez IEnumebale une boîte contenant IEnumerator à l'intérieur (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();
}
}
Un IEnumerator
est une chose qui peut énumérer: il a la propriété et les Current
MoveNext
et Reset
méthodes (qui dans le code .NET, vous ne serez probablement pas appeler explicitement , bien que tu puisses).
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
.
Lequel utilisez-vous? La seule raison d'utiliser IEnumerator
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 devez créer une nouvelle classe implémentant IEnumerator
. Mais vous devrez toujours retourner ce IEnumerator
dans une classe IEnumerable
.
Pour voir ce que le recenseur (mise en œuvre IEnumerator<T>
) ressemble, voir une classe Enumerator<T>
, tels que ceux contenus dans List<T>
, Queue<T>,
ou Stack<T>
. Pour voir une classe implémentant IEnumerable
, consultez une classe de collection standard.
Un Enumerator
vous montre les ouvrages d'une liste ou de 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 du code qui utilise un énumérateur. Un Enumerable
est une classe qui peut vous donner Enumerator
s.Il a une méthode appelée GetEnumerator
qui vous donne un Enumerator
qui regarde ses articles. 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.
Cet article de blog est plutôt inexact. – SLaks
Dupliquer: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me –