2009-03-06 36 views

Respuesta

90

IEnumerable es una interfaz que define un método GetEnumerator que devuelve una interfaz IEnumerator, esto a su vez permite el acceso de sólo lectura a una colección. Una colección que implementa IEnumerable se puede usar con una instrucción foreach.

Definición

IEnumerable 

public IEnumerator GetEnumerator(); 

IEnumerator 

public object Current; 
public void Reset(); 
public bool MoveNext(); 

example code from codebetter.com

+3

@Rex M: Creo que el código tiene sentido. IEnumerable tiene un método GetEnumerator que devuelve un IEnumer * ator *, no IEnumer * able *. – Lernkurve

+5

@Lernkurve La respuesta se modificó para que fuera correcta después de publicar mi comentario. –

6

IEnumerable e IEnumerator son ambas interfaces. IEnumerable tiene solo un método llamado GetEnumerator. Este método se vuelve a usar (dado que todos los métodos devuelven algo, incluido el vacío), otro tipo que es una interfaz y esa interfaz es IEnumerator. Cuando implementa la lógica de enumerador en cualquiera de sus clases de colección, implementa IEnumerable (genérico o no genérico). IEnumerable tiene solo un método, mientras que IEnumerator tiene 2 métodos (MoveNext y Reset) y una propiedad Current. Para facilitar la comprensión, considere IEnumebale un cuadro que contiene IEnumerator dentro de él (aunque no a través de herencia o contención). Ver el código para una mejor comprensión:

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 es una cosa que puede enumerar: tiene la propiedad Current y los métodos MoveNext y Reset (que en el código de .NET es probable que no llamar explícitamente , aunque podrías).

Un IEnumerable es una cosa que se puede enumerar ... lo que simplemente significa que tiene un método GetEnumerator que devuelve IEnumerator.

¿Cuál es tu uso? La única razón para usar IEnumerator es si tiene algo que tiene una forma no estándar de enumerar (es decir, devolver sus diversos elementos uno por uno), y necesita definir cómo funciona. Crearías una nueva clase implementando IEnumerator. Pero aún tendría que devolver ese IEnumerator en una clase IEnumerable.

Para un vistazo a lo que un empadronador (implementando IEnumerator<T>) parece, ver ninguna clase Enumerator<T>, tales como las contenidas en List<T>, Queue<T>, o Stack<T>. Para ver una clase que implementa IEnumerable, consulte cualquier clase de recopilación estándar.

13

Un Enumerator le muestra los elementos de una lista o colección. Cada instancia de un Enumerador está en una posición determinada (el 1er elemento, el 7mo elemento, etc.) y puede darle ese elemento (IEnumerator.Current) o pasar al siguiente (IEnumerator.MoveNext). Cuando escribe un bucle foreach en C#, el compilador genera código que usa un Enumerador.

Un Enumerable es una clase que le puede dar Enumerator s.Tiene un método llamado GetEnumerator que le da un Enumerator que mira sus artículos. Cuando se escribe un ciclo foreach en C#, el código que genera llama a GetEnumerator para crear el Enumerator utilizado por el ciclo.

+1

Esa publicación del blog es bastante inexacta. – SLaks

Cuestiones relacionadas