Teilen über


Beispiel für verzögerte Ausführung (LINQ to XML)

In diesem Artikel wird gezeigt, wie sich verzögerte Ausführung und faule Auswertung auf die Ausführung Ihrer LINQ to XML-Abfragen auswirken.

Beispiel: Verwenden des yield return-Konstrukts in einer Erweiterungsmethode, um die Ausführung zu verzögern.

Das folgende Beispiel zeigt die Reihenfolge der Ausführung bei Verwendung einer Erweiterungsmethode, die verzögerte Ausführung verwendet. Im Beispiel wird ein Array mit drei Zeichenfolgen deklariert. Anschließend iteriert es durch die Sammlung, die von ConvertCollectionToUpperCase zurückgegeben wird.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Beachten Sie, dass beim Durchlaufen der von ConvertCollectionToUpperCase zurückgegebenen Auflistung jedes Element aus dem Quellzeichenfolgenarray abgerufen und in Großbuchstaben konvertiert wird, bevor das nächste Element aus dem Quellzeichenfolgenarray abgerufen wird.

Sie können sehen, dass das gesamte Array von Zeichenfolgen nicht in Großbuchstaben konvertiert wird, bevor jedes Element in der zurückgegebenen Auflistung in der foreach-Schleife in Main verarbeitet wird.

Siehe auch