Implementando iteradores vacíos
-
05-07-2019 - |
Pregunta
Tengo este código:
public IEnumerable<int> Iterator {
get { if (false) yield return -1; }
}
Es bastante feo, pero cuando intentas refactorizarlo para:
public IEnumerable<int> Iterator {
get { return null; }
}
El siguiente código se rompe:
foreach (var item in obj.Iterator) {
}
¿Cómo harías para limpiar esto?
Solución
.NET Framework ya tiene un método para hacer exactamente esto, por cierto (haciendo que el código de Jared sea redundante): System.Enumerable.Empty<T>
.
Otros consejos
public IEnumerable<int> Iterator {
get { yield break; }
}
Una mejor solución sería definir un método reutilizable para este problema. Mantengo un método en mi biblioteca compartida para ocuparme solo de este caso.
public static class CollectionUtility {
public static IEnumerable<T> CreateEmptyEnumerable<T>() {
yield break;
}
}
Ahora, en su método, simplemente podría llamar
public static IEnumerable<int> Iterator {
get { return CollectionUtility.CreateEmptyEnumerable<int>(); }
}
public IEnumerable<int> Iterator {
get { yield break; }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow