Příklad řetězení dotazů (C#) (LINQ to XML)

Tento příklad vychází z příkladu odloženého provádění a ukazuje, co nastane, když zřetězíte dva dotazy, které používají odložené provádění a líné vyhodnocení.

Příklad: Přidejte druhou metodu rozšíření, která používá yield return k odložení provádění.

V tomto příkladu se zavádí další rozšiřující metoda, AppendStringkterá připojí zadaný řetězec ke každému řetězci ve zdrojové kolekci a poté získá změněný řetězec.

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();
        }
    }
}

Tento příklad vytvoří následující výstup:

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!!!<

V tomto příkladu vidíte, že každá metoda rozšíření pracuje po jednom pro každou položku ve zdrojové kolekci.

Z tohoto příkladu by mělo být zřejmé, že i když jsme zřetězili dotazy, které vracejí kolekce, žádné mezilehlé kolekce nejsou materializovány. Místo toho se každá položka předává z jedné líné metody do další. Výsledkem je mnohem menší paměťová stopa než přístup, který nejprve vezme jedno pole řetězců, pak vytvoří druhé, kde jsou řetězce převedeny na velká písmena, a nakonec třetí pole řetězců, kde je ke každému řetězci připojen vykřičník.

Další článek v tomto kurzu ukazuje průběžnou materializaci:

Viz také