c# - instruccion - ¿Hay alguna diferencia entre los métodos del iterador que devuelven IEnumerable<T> e IEnumerator<T>?
yield return c# stack overflow (2)
Considere dos métodos de iterador con los mismos cuerpos:
public static IEnumerable<int> It1() {
...
}
public static IEnumerator<int> It2() {
...
}
¿Hay alguna circunstancia en que llamar a It2
sea diferente de llamar a It1.GetEnumerator()
?
¿Hay alguna vez una buena razón para definir un iterador como IEnumerator<T>
sobre IEnumerable<T>
? El único en el que puedo pensar es cuando está implementando IEnumerable<T>.GetEnumerator()
.
EDITAR: Por métodos de iterador me refiero a métodos que usan construcciones de yield break
y yield break
.
Haría esto si quisiera hacerse cargo de escribir la clase de contenedor IEnumerable<T>
.
Digamos que tienes una clase en la que quieres hacer la enumeración, 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);
}
}
}
Como se señaló, no puede foreach
sobre un IEnumerator<T>
. Debido a eso, dificulta la integración en lugares en el código donde desea iterar sobre lo que está devolviendo.
Además, la impugnación aquí es que IEnumerable<T>
está destinado a ser una fábrica, por lo que puede producir implementaciones de IEnumerator<T>
que no están directamente relacionadas con 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 con IEnumerable<T>
, por lo que querrá hacer que sus enumeraciones sean tan fáciles de trabajar como sea posible devolviéndolas.