Partager via


Chaînage d'opérateurs de requête standard

Il s'agit de la dernière rubrique du didacticiel Chaînage de requêtes.

Les opérateurs de requête standard peuvent également être chaînés ensemble.Par exemple, vous pouvez lancer l'opérateur Enumerable.Where et il fonctionne également de manière différée.Aucun résultat intermédiaire n'est matérialisé par l'opérateur.

Exemple

Dans cet exemple, la méthode Where est appelée avant ConvertCollectionToUpperCase.La méthode Where opère presque exactement de la même façon que les méthodes différées utilisées dans les exemples précédents de ce didacticiel, ConvertCollectionToUpperCase et AppendString.

Il existe toutefois une différence : dans le cas présent, la méthode Where itère au sein de sa collection source, détermine que le premier élément ne passe pas le prédicat et obtient l'élément suivant qui, lui, passe.Elle génère ensuite le deuxième élément.

L'idée de base est néanmoins identique : les collections intermédiaires ne sont matérialisées que si elles doivent l'être.

Lorsque des expressions de requêtes sont utilisées, elles sont converties en appels aux opérateurs de requête standard et les mêmes principes sont applicables.

Tous les exemples de cette section qui interrogent des documents Office Open XML utilisent le même principe.L'exécution et l'évaluation différées sont deux concepts fondamentaux que vous devez comprendre pour utiliser LINQ (et LINQ to XML) de manière optimale.

[!REMARQUE]

L'exemple suivant utilise la construction yield return de C#.Étant donné qu'il n'y a aucune fonctionnalité équivalente en Visual Basic 2008, cet exemple est fourni uniquement en C#.

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()
            where s.CompareTo("D") >= 0
            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<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

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

Voir aussi

Concepts

Didacticiel : Chaînage de requêtes