estoy escribiendo código que es similar a esto:¿Cómo se diseña un enumerador que devuelve (teóricamente) una cantidad infinita de elementos?
public IEnumerable<T> Unfold<T>(this T seed)
{
while (true)
{
yield return [next (T)object in custom sequence];
}
}
Obviamente, este método nunca va a volver. (El compilador de C# en silencio lo permite, mientras que R # me da la advertencia "Función nunca regresa".)
En términos generales, es que mal diseño para proporcionar un enumerador que devuelve un número infinito de elementos, sin proporcionando una forma de dejar de enumerar?
¿Hay alguna consideración especial para este escenario? Mem? Perf? ¿Otros problemas?
Si siempre proporcionamos una condición de salida, ¿cuáles son las opciones? Por ejemplo:
- un objeto de tipo T que representa el límite inclusivo o exclusivo
- un
Predicate<T> continue
(como se haceTakeWhile
) - un recuento (como se hace
Take
) - ...
¿Debemos confiar en los usuarios que llaman al Take(...)
/TakeWhile(...)
después del Unfold(...)
? (Tal vez la opción preferida, ya que aprovecha el conocimiento Linq existente.)
Respondería esta pregunta de manera diferente si el código se publicaría en una API pública, ya sea como es (genérico) o como una implementación específica de este patrón?
Por cierto, puede encontrar esta interesante en relación con su pregunta: http://blogs.msdn.com/b/wesdyer/archive/2007/02/13/the-virtues-of-laziness.aspx – joce