Delen via


Voorbeeld van ketenquery's (C#) (LINQ naar XML)

Dit voorbeeld bouwt voort op het voorbeeld van de uitgestelde uitvoering en laat zien wat er gebeurt wanneer u twee query's koppelt die zowel de uitgestelde uitvoering als de luie evaluatie gebruiken.

Voorbeeld: Een tweede extensiemethode toevoegen die wordt gebruikt yield return om de uitvoering uit te stellen

In dit voorbeeld wordt een andere extensiemethode geïntroduceerd, AppendStringdie een opgegeven tekenreeks toevoegt aan elke tekenreeks in de bronverzameling en vervolgens de gewijzigde tekenreeks oplevert.

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

In dit voorbeeld ziet u dat elke extensiemethode één voor één werkt voor elk item in de bronverzameling.

Wat in dit voorbeeld duidelijk moet zijn, is dat, ook al hebben we query's aan elkaar gekoppeld die verzamelingen opleveren, er geen tussenliggende verzamelingen worden gerealiseerd. In plaats daarvan wordt elk item doorgegeven van de ene luie methode naar de volgende. Dit resulteert in een veel kleinere geheugenvoetafdruk dan een benadering die eerst één matrix met tekenreeksen zou gebruiken, en vervolgens een tweede matrix met tekenreeksen maakt die zijn geconverteerd naar hoofdletters en ten slotte een derde matrix met tekenreeksen maakt waarbij aan elke tekenreeks de uitroeptekens zijn toegevoegd.

Het volgende artikel in deze zelfstudie illustreert tussenliggende materialisatie:

Zie ook