Maison >développement back-end >C++ >Comment le mot-clé C # «Rende» permet-il une itération efficace sur les collections?
C# yield
Mot clé : Optimisation de l'itération de collection
Le mot-clé C# yield
, introduit dans C# 2.0, offre un mécanisme puissant pour créer des itérateurs efficaces sur les collections. Ceci est particulièrement pertinent lorsqu'il s'agit de grands ensembles de données ou de scénarios dans lesquels l'exposition d'une seule partie d'une collection est nécessaire.
Fonctionnalité de yield
yield
permet aux méthodes de renvoyer un objet IEnumerable
. Cette interface représente une séquence d'éléments qui peuvent être itérés à l'aide d'une boucle foreach
. Surtout, yield
ne nécessite pas que la collection entière soit chargée en mémoire en même temps.
Au lieu de cela, lorsqu'une boucle foreach
parcourt une méthode basée sur yield
, la méthode ne s'exécute que jusqu'à ce qu'elle rencontre une instruction yield return
. Il renvoie ensuite la valeur obtenue et suspend son exécution. La méthode reprend l'exécution uniquement lorsque l'élément suivant est demandé dans l'itération. Il s'agit essentiellement d'une machine à états qui génère des valeurs à la demande.
Exemple illustratif
Envisagez une méthode de filtrage des éléments d'une liste plus grande :
<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>
Ici, FilteredList
renvoie uniquement les éléments présents à la fois dans fullList
et partialList
. Il traite fullList
un élément à la fois, ne produisant que ceux qui remplissent la condition. Cela évite de créer une nouvelle liste filtrée, potentiellement volumineuse, en mémoire.
Applications pratiques
Le mot-clé yield
est largement utilisé dans :
Itérateurs personnalisés : Création d'itérateurs pour des structures de données ou des algorithmes personnalisés sans avoir à pré-remplir une collection.
Récupération efficace des données : Récupération progressive des données à partir de bases de données ou d'autres sources externes, réduisant ainsi la consommation de mémoire et améliorant les performances. Prenons cet exemple de lecture à partir d'une base de données :
<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>
Cette approche récupère et traite les lignes de la base de données une par une, ce qui est nettement plus efficace que le chargement de l'ensemble des résultats en mémoire.
En tirant parti du mot-clé yield
, les développeurs peuvent créer des solutions élégantes et efficaces pour parcourir les collections, en particulier lorsqu'il s'agit de données volumineuses ou générées dynamiquement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!