2009-03-06 6 views

Répondre

90

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(); 

example code from codebetter.com

+3

@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

+5

@Lernkurve la réponse a été modifiée pour être correcte après avoir posté mon commentaire. –

6

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(); 
     } 
    } 
58

Un IEnumerator est une chose qui peut énumérer: il a la propriété et les CurrentMoveNext 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.

13

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.

+1

Cet article de blog est plutôt inexact. – SLaks

Questions connexes