Exempel på uppskjuten körning (LINQ till XML)

Den här artikeln visar hur uppskjuten körning och lat utvärdering påverkar körningen av LINQ till XML-frågor.

Exempel: Använd konstruktionen i en tilläggsmetod för att skjuta upp körningen yield return

I följande exempel visas körningsordningen när du använder en tilläggsmetod som använder uppskjuten körning. Exemplet deklarerar en matris med tre strängar. Den itererar sedan genom samlingen som returneras av ConvertCollectionToUpperCase.

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

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

        var q = from str in stringArray.ConvertCollectionToUpperCase()
                select str;

        foreach (string str in q)
            Console.WriteLine("Main: str {0}", str);
    }
}
Imports System.Runtime.CompilerServices

Module Module1

    <Extension()>
    Private Iterator Function ConvertCollectionToUpperCase(
    ByVal source As IEnumerable(Of String)) _
    As IEnumerable(Of String)
        For Each str As String In source
            Console.WriteLine("ToUpper: source {0}", str)
            Yield str.ToUpper()
        Next
    End Function

    Sub Main()
        Dim stringArray = New String() {"abc", "def", "ghi"}

        Dim q = From str In stringArray.ConvertCollectionToUpperCase()
                Select str

        For Each Str As String In q
            Console.WriteLine("Main: str {0}", Str)
        Next
    End Sub

End Module

Det här exemplet genererar följande utdata:

ToUpper: source abc
Main: str ABC
ToUpper: source def
Main: str DEF
ToUpper: source ghi
Main: str GHI

Observera att när du itererar genom samlingen som returneras av ConvertCollectionToUpperCasehämtas varje objekt från källsträngmatrisen och konverteras till versaler innan nästa objekt hämtas från källsträngmatrisen.

Du kan se att hela matrisen med strängar inte konverteras till versaler innan varje objekt i den returnerade samlingen bearbetas i loopen foreach i Main.

Se även