¿Hay alguna diferencia entre los métodos iteradores que devuelven IEnumerable < T > y IEnumerator < T > ;?

StackOverflow https://stackoverflow.com/questions/416651

  •  03-07-2019
  •  | 
  •  

Pregunta

Considere dos métodos iteradores con los mismos cuerpos:

public static IEnumerable<int> It1() { 
    ...
}

public static IEnumerator<int> It2() { 
    ...
}

¿Existe alguna circunstancia en la que llamar a It2 sea diferente a llamar a It1.GetEnumerator () ?

¿Hay alguna buena razón para definir un iterador como IEnumerator < T > sobre IEnumerable < T > ? El único en el que puedo pensar es cuando estás implementando IEnumerable < T > .GetEnumerator () .

EDITAR: por métodos iteradores me refiero a los métodos que usan rendimiento rendimiento y yield break construcciones.

¿Fue útil?

Solución

Haría esto si quisiera hacerse cargo de escribir la clase de envoltura IEnumerable < T > .

Digamos que tiene una clase en la que desea enumerar infinitamente:

public class EveryDateInTheFuture : IEnumerable<DateTime>
{
    public EveryDateInTheFuture() { this.StartDate = DateTime.Today; }

    public DateTime StartDate { get; set; }

    public IEnumerator<DateTime> GetEnumerator()
    {
         while (true)
         {
             yield return date;
             date = date.AddDays(1);
         }
    }
}

Otros consejos

Como se indicó, no puede foreach sobre un IEnumerator < T > . Debido a eso, hace que sea difícil integrarlo en los lugares en el código donde desea iterar sobre lo que está devolviendo.

Además, la importancia aquí es que IEnumerable < T > está destinado a ser una fábrica, por lo que puede producir implementaciones de IEnumerator < T > que no son directamente vinculado a la implementación de la colección de T .

Aún más importante ahora es el hecho de que todos los métodos de extensión para LINQ funcionan fuera de IEnumerable < T > , por lo que querrá hacer que sus enumeraciones sean lo más fáciles de trabajar posible devolviéndolo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top