Sie können yield
verwenden, um einen Iterator zu erstellen. Das könnte eine träge ausgewertete Serie sein (z. B. Lesen von Zeilen aus einer Datei oder einer Datenbank, ohne alles auf einmal zu lesen, was zu viel im Speicher sein könnte), oder könnte über bestehende Daten wie List<T>
iterieren.
C# in Depth hat ein freies Kapitel (6) alles über Iterator Blöcke.
Ich auch blogged vor kurzem über die Verwendung yield
für intelligente Brute-Force-Algorithmen.
Ein Beispiel für die Faulen Datei Leser:
static IEnumerable<string> ReadLines(string path) {
using (StreamReader reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
Dies ist völlig "faul"; nichts wird gelesen, bis Sie mit dem Aufzählen beginnen, und nur eine einzelne Zeile wird jemals im Speicher gehalten.
Beachten Sie, dass LINQ-to-Objects umfangreiche Verwendung von Iterator-Blöcken (yield
) macht.im Wesentlichen Zum Beispiel ist die Where
Erweiterung:
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate) {
foreach (T item in data) {
if (predicate(item)) yield return item;
}
}
Und wieder voll faul - so dass Sie verketten mehrere Operationen ohne alles zwingt in den Speicher geladen werden.
möglich Duplikat (http://stackoverflow.com/questions/17125/what-are-real-life-Anwendungen-of-Yield) – nawfal
Eine Antwort finden Sie hier: http://StackOverflow.com/Questions/14057788/Why-use-the-Yield-Keyword-when -i-can-just-use-an-normal-ienumerable – hdoghmen