Partager via


Exemple de requêtes de chaîne (C#) (LINQ to XML)

Cet exemple s'appuie sur l'exemple dans l'exemple d'exécution différée et montre ce qui se passe lorsque vous chaînez deux requêtes qui utilisent toutes deux l'exécution différée et l'évaluation paresseuse.

Exemple : Ajouter une deuxième méthode d’extension qui utilise yield return pour différer l’exécution

Dans cet exemple, une autre méthode d’extension est introduite, AppendStringqui ajoute une chaîne spécifiée à chaque chaîne de la collection source, puis génère la chaîne modifiée.

public static class LocalExtensions
{
    public static IEnumerable<string>
      ConvertCollectionToUpperCase(this IEnumerable<string> source)
    {
        foreach (string str in source)
        {
            Console.WriteLine("ToUpper: source >{0}<", str);
            yield return str.ToUpper();
        }
    }

    public static IEnumerable<string>
      AppendString(this IEnumerable<string> source, string stringToAppend)
    {
        foreach (string str in source)
        {
            Console.WriteLine("AppendString: source >{0}<", str);
            yield return str + stringToAppend;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string[] stringArray = { "abc", "def", "ghi" };

        IEnumerable<string> q1 =
            from s in stringArray.ConvertCollectionToUpperCase()
            select s;

        IEnumerable<string> q2 =
            from s in q1.AppendString("!!!")
            select s;

        foreach (string str in q2)
        {
            Console.WriteLine("Main: str >{0}<", str);
            Console.WriteLine();
        }
    }
}

Cet exemple génère la sortie suivante :

ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<

ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<

Dans cet exemple, vous pouvez voir que chaque méthode d’extension fonctionne une par une pour chaque élément de la collection source.

Ce qui doit être évident à partir de cet exemple, c'est que même si nous avons enchaîné des requêtes qui produisent des collections, aucune collection intermédiaire n'est réellement matérialisée. Au lieu de cela, chaque élément est passé d'une méthode paresseuse à l'autre. Cela entraîne une empreinte mémoire beaucoup plus petite qu’une approche qui prendrait d’abord un tableau de chaînes, puis créez un deuxième tableau de chaînes qui ont été converties en majuscules, puis créez un troisième tableau de chaînes où chaque chaîne a les points d’exclamation ajoutés.

L’article suivant de ce tutoriel illustre la matérialisation intermédiaire :

Voir aussi