c# - ¿Cuál es la diferencia entre IEnumerator e IEnumerable?
.net (4)
Posible duplicado:
¿Alguien puede explicarme IEnumerable e IEnumerator?
¿Cuáles son las diferencias entre IEnumerator e IEnumerable?
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). 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();
}
}
Un Enumerator
muestra los elementos en 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 ciclo foreach
en C #, el compilador genera código que usa un Enumerador.
Un Enumerable
es una clase que puede darte el Enumerator
s. Tiene un método llamado GetEnumerator
que le da un Enumerator
que mira sus artículos. Cuando escribe un ciclo foreach
en C #, el código que genera llama a GetEnumerator
para crear el Enumerator
utilizado por el ciclo.
Un IEnumerator
es una cosa que puede enumerar: tiene la propiedad Current
y los métodos MoveNext
y Reset
(que en el código .NET probablemente no llame explícitamente, aunque podría).
Un IEnumerable
es una cosa 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, devolver sus diversos elementos uno por uno), y necesita definir cómo funciona. IEnumerator
una nueva clase implementando IEnumerator
. Pero aún tendría que devolver ese IEnumerator
en una clase IEnumerable
.
Para ver cómo luce un enumerador (implementando IEnumerator<T>
), consulte cualquier clase Enumerator<T>
, como las que figuran en List<T>
, Queue<T>,
o Stack<T>
. Para ver una clase que implementa IEnumerable
, consulte cualquier clase de colección estándar.
IEnumerable es una interfaz que define un método GetEnumerator que devuelve una interfaz IEnumerator , lo que 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();