Maison >développement back-end >C++ >Comment le mot-clé C # «Rende» permet-il une itération efficace sur les collections?

Comment le mot-clé C # «Rende» permet-il une itération efficace sur les collections?

Susan Sarandon
Susan Sarandonoriginal
2025-01-27 17:46:13628parcourir

How Does the C# `yield` Keyword Enable Efficient Iteration Over 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn