Dela via


Exempel på kedjefrågor (C#) (LINQ till XML)

Det här exemplet bygger på exemplet i exemplet med uppskjuten körning och visar vad som händer när du kedjar ihop två frågor som båda använder uppskjuten körning och lat utvärdering.

Exempel: Lägg till en andra tilläggsmetod som används yield return för att skjuta upp körningen

I det här exemplet introduceras en annan tilläggsmetod, AppendString, som lägger till en angiven sträng i varje sträng i källsamlingen och sedan ger den ändrade strängen.

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

Det här exemplet genererar följande utdata:

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

I det här exemplet kan du se att varje tilläggsmetod fungerar en i taget för varje objekt i källsamlingen.

Vad som bör stå klart i det här exemplet är att även om vi har länkat samman frågor som ger samlingar materialiseras inga mellanliggande samlingar. I stället skickas varje objekt från en lat metod till nästa. Detta resulterar i ett mycket mindre minnesavtryck än en metod som först skulle ta en matris med strängar, sedan skapa en andra matris med strängar som har konverterats till versaler och slutligen skapa en tredje matris med strängar där varje sträng har utropstecken tillagt.

Nästa artikel i den här självstudien illustrerar mellanliggande materialisering:

Se även