¿Alguien me puede explicar cuál es la diferencia entre IEnumerable & IEnumerator, y cómo usarlos?IEnumerable & IEnumerator
Gracias !!!
¿Alguien me puede explicar cuál es la diferencia entre IEnumerable & IEnumerator, y cómo usarlos?IEnumerable & IEnumerator
Gracias !!!
Generalmente, un IEnumerable
es un objeto que se puede enumerar, como una lista o matriz. Un IEnumerator
es un objeto que almacena el estado de la enumeración.
La razón por la que no son una y lo mismo es que podría tener múltiples enumeraciones sobre el mismo objeto al mismo tiempo, incluso en una aplicación de un único subproceso. Por ejemplo, considere el siguiente código:
foreach (x in mylist)
{
foreach (y in mylist)
{
if (x.Value == y.Value && x != y)
{
// Found a duplicate value
}
}
}
Esto funciona bien si mylist
es una aplicación adecuada de IEnumerable
, pero sería un error si mylist
regresaron a sí mismo como el encuestador.
Creo que una implementación de muestra de IEnumerator ayudaría al OP. Es mucho más claro una vez que veas cómo esos dos juegan junto ... – Tigraine
Un IEnumerable
es algo que se puede enumerar. Un IEnumerator
es el medio para hacer esa enumeración. Así IEnumerable
define sólo un método - GetEnumerator
, que devuelve una instancia de IEnumerator
para hacer el trabajo de campo real ...
IEnumerable significa algo que se pueden enumerar, IEnumerator es algo que lo enumera.
simplificarlo a un simple bucle for:
for (int i=0; i<10;i++)
{
count+=myarray[i];
}
En el ejemplo anterior, estaría IEnumerator, y myarray habría IEnumerable.
Eso no es correcto - yo simplemente soy un 'int', no implementa' IEnumerator'. – EMP
IEnumerable
define un objeto que contiene una agregación de objetos, que se pueden enumerar.
es el objeto que permite enumerar la agregación y almacena el estado de la enumeración.
La interfaz IEnumerable
define una clase que se puede enumerar, es decir, contiene elementos a los que se puede acceder a través de la enumeración.
Las interfaces IEnumerator
definen una clase que puede realizar la enumeración sobre una secuencia de elementos.
La distinción es que IEnumerable
significa "usted puede enumerarme", donde IEnumerator
realiza la tarea de enumeración.
Para elaborar un poco más, IEnumerable
expone un método GetEnumerator
. Este método devuelve un IEnumerator
que luego puede usar para realizar la enumeración. Normalmente, usted no maneja este método usted mismo, porque la palabra clave foreach
lo maneja por usted.
foreach(int element in myList)
{
// Do some work...
}
Este código es en realidad amplió para usted por el compilador en esto:
IEnumerator enumerator = myList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = (int)enumerator.Current;
// Do some work...
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Como se puede ver, una IEnumerator
se utiliza aquí para realizar la enumeración a través de los elementos.
Diferencia entre IEnumerable y IEnumerator.
Obtener Code-IEnumerable & IEnumerator
public class Program {
public static void Main(string[] args) {
IEnumerable_Example();
}
static void IEnumerable_Example() {
List <string> Month = new List <string>();
Month.Add("January");
Month.Add("February");
Month.Add("March");
Month.Add("April");
Month.Add("May");
Month.Add("June");
Month.Add("July");
Month.Add("August");
Month.Add("September");
Month.Add("October");
Month.Add("November");
Month.Add("December");
IEnumerable <string> IEnumerable_ = (IEnumerable <string>) Month;
Console.WriteLine("IEnumerable_Example() Executing");
Console.WriteLine("------------IEnumerable Returning items using foreach----------------");
foreach(string i in IEnumerable_) {
Console.WriteLine(i);
}
IEnumerator_Example(IEnumerable_);
}
static public void IEnumerator_Example(IEnumerable enumerable) {
IEnumerator enumerator = enumerable.GetEnumerator();
Console.WriteLine("----------IEnumerator_Example() Executing------------");
while (enumerator.MoveNext()) {
Console.WriteLine("----" + enumerator.Current.ToString() + "----");
}
En qué idioma/plataforma? –
Eso será .NET - se ha vuelto a marcar. –