Pregunta

Posible duplicado:
¿Alguien puede explicarme IEnumerable e IEnumerator?

¿Cuáles son las diferencias entre IEnumerator e IEnumerable?

¿Fue útil?

Solución

IEnumerable es una interfaz que define un método GetEnumerator que devuelve un IEnumerator , esto a su vez permite el acceso de solo 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();

código de ejemplo de codebetter.com

Otros consejos

Un IEnumerator es una cosa que puede enumerar:tiene el Current propiedad y la MoveNext y Reset métodos (que en código .NET probablemente no llamará explícitamente, aunque podría hacerlo).

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

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

Para ver lo que hace un enumerador (implementando IEnumerator<T>) parece, ver cualquiera Enumerator<T> clase, como las contenidas en List<T>, Queue<T>, o Stack<T>.Para ver una clase que implementa IEnumerable, consulte cualquier clase de colección estándar.

Un Enumerator le muestra los elementos en una lista o colección. Cada instancia de un enumerador está en una posición determinada (el primer elemento, el séptimo 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 puede darte GetEnumerator s. Tiene un método llamado <=> que le da un <=> que mira sus elementos. Cuando escribe un bucle <=> en C #, el código que genera llama <=> para crear el <=> utilizado por el bucle.

IEnumerable e IEnumerator son ambas interfaces. IEnumerable tiene solo un método llamado GetEnumerator. Este método vuelve a ejecutar (ya que todos los métodos devuelven algo, incluido void), otro tipo que es una interfaz y esa interfaz es IEnumerator. Cuando implementa la lógica del enumerador en cualquiera de su clase 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 una fácil comprensión, considere IEnumebale un cuadro que contiene IEnumerator dentro de él (aunque no a través de herencia o contención). Vea 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();
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top