2010-04-14 15 views
6

¿Alguien me puede explicar cuál es la diferencia entre IEnumerable & IEnumerator, y cómo usarlos?IEnumerable & IEnumerator

Gracias !!!

+0

En qué idioma/plataforma? –

+0

Eso será .NET - se ha vuelto a marcar. –

Respuesta

11

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.

+0

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

3

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 ...

0

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.

+0

Eso no es correcto - yo simplemente soy un 'int', no implementa' IEnumerator'. – EMP

2

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.

10

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.

0

Diferencia entre IEnumerable y IEnumerator.

  1. IEnumerable utiliza IEnumerator internamente.
  2. IEnumerable no sabe qué elemento/objeto se está ejecutando.
  3. IEnumerator conoce la posición actual del elemento/objeto.
  4. IEnumerable no conoce la posición actual del punto/objeto
  5. IEnumerable tiene un método, GetEnumerator()

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() + "----"); 
     } 
Cuestiones relacionadas