Puede usar yield
para compilar cualquier iterador. Esa podría ser una serie perezosamente evaluada (líneas de lectura de un archivo o base de datos, por ejemplo, sin leer todo de una vez, que podría ser demasiado para guardar en la memoria), o podría iterar sobre datos existentes como List<T>
.
C# in Depth tiene un capítulo libre (6) todo sobre bloques de iterador.
Yo también blogged muy recientemente sobre el uso de yield
para los algoritmos inteligentes de fuerza bruta.
Para un ejemplo del lector de archivos perezoso:
static IEnumerable<string> ReadLines(string path) {
using (StreamReader reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
Esto es completamente "perezosa"; nada se lee hasta que empiece a enumerar, y solo se guarda una sola línea en la memoria.
Tenga en cuenta que LINQ-to-Objects hace extensa uso de bloques iterador (yield
).Por ejemplo, la extensión es esencialmente Where
:
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate) {
foreach (T item in data) {
if (predicate(item)) yield return item;
}
}
Y de nuevo, totalmente vago - lo que le permite encadenar múltiples operaciones sin forzar todo para ser cargado en la memoria.
posible duplicado de (http://stackoverflow.com/questions/17125/what-are-real-life-applications-of-yield) – nawfal
Puede encontrar una respuesta aquí: http://stackoverflow.com/questions/14057788/why-use-the-yield-keyword-when -i-could-just-use-an-ordinary-ienumerable – hdoghmen