que instruccion c# iterator

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.