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.