C# yield
Schlüsselwort: Optimierung der Sammlungsiteration
Das C#-Schlüsselwort yield
, das in C# 2.0 eingeführt wurde, bietet einen leistungsstarken Mechanismus zum Erstellen effizienter Iteratoren über Sammlungen. Dies ist besonders relevant, wenn es um große Datensätze oder Szenarien geht, bei denen nur ein Teil einer Sammlung offengelegt werden muss.
Funktionalität von yield
yield
ermöglicht Methoden, ein IEnumerable
-Objekt zurückzugeben. Diese Schnittstelle stellt eine Folge von Elementen dar, die mithilfe einer foreach
-Schleife iteriert werden können. Entscheidend ist, dass yield
nicht die gesamte Sammlung auf einmal in den Speicher geladen werden muss.
Wenn stattdessen eine foreach
-Schleife eine yield
-basierte Methode durchläuft, wird die Methode nur so lange ausgeführt, bis sie auf eine yield return
-Anweisung trifft. Anschließend gibt es den zurückgegebenen Wert zurück und unterbricht die Ausführung. Die Methode nimmt die Ausführung erst wieder auf, wenn das nächste Element in der Iteration angefordert wird. Dabei handelt es sich im Wesentlichen um eine Zustandsmaschine, die bei Bedarf Werte generiert.
Anschauliches Beispiel
Stellen Sie sich eine Methode vor, die Elemente aus einer größeren Liste filtert:
<code class="language-csharp">IEnumerable<object> FilteredList(IList<object> fullList, IList<object> partialList) { foreach (object item in fullList) { if (partialList.Contains(item)) yield return item; } }</code>
Hier gibt FilteredList
nur die Elemente zurück, die sowohl in fullList
als auch in partialList
vorhanden sind. Es verarbeitet fullList
jeweils ein Element und liefert nur diejenigen, die die Bedingung erfüllen. Dadurch wird vermieden, dass eine neue, möglicherweise große, gefilterte Liste im Speicher erstellt wird.
Praktische Anwendungen
Das Schlüsselwort yield
wird häufig verwendet in:
Benutzerdefinierte Iteratoren: Erstellen von Iteratoren für benutzerdefinierte Datenstrukturen oder Algorithmen ohne den Aufwand, eine Sammlung vorab zu füllen.
Effizienter Datenabruf: Inkrementelles Abrufen von Daten aus Datenbanken oder anderen externen Quellen, wodurch der Speicherverbrauch reduziert und die Leistung verbessert wird. Betrachten Sie dieses Beispiel für das Lesen aus einer Datenbank:
<code class="language-csharp">public IEnumerable<T> ReadData<T>(string query, Func<IDataReader, T> mapper) { using (var reader = ExecuteQuery(query)) { while (reader.Read()) { yield return mapper(reader); } } }</code>
Dieser Ansatz ruft Datenbankzeilen einzeln ab und verarbeitet sie, was deutlich effizienter ist, als den gesamten Ergebnissatz in den Speicher zu laden.
Durch die Nutzung des Schlüsselworts yield
können Entwickler elegante und effiziente Lösungen für die Iteration über Sammlungen erstellen, insbesondere beim Umgang mit großen oder dynamisch generierten Daten.
Das obige ist der detaillierte Inhalt vonWie ermöglicht das C#-Schlüsselwort „yield' eine effiziente Iteration über Sammlungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!