¿Hay alguna diferencia entre los métodos iteradores que devuelven IEnumerable < T > y IEnumerator < T > ;?
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.
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.