Beispiel für das Verketten von Abfragen (C#)Chaining Queries Example (C#)

Dieses Beispiel baut auf dem vorherigen Beispiel auf und zeigt, was passiert, wenn Sie zwei Abfragen miteinander verketten, die beide mit verzögerter Ausführung und verzögerter Auswertung arbeiten.This example builds on the previous example and shows what happens when you chain together two queries that both use deferred execution and lazy evaluation.

BeispielExample

In diesem Beispiel wird eine andere Erweiterungsmethode eingeführt: AppendString. Diese Methode fügt jeder Zeichenfolge in der Quellauflistung eine bestimmte Zeichenfolge an und gibt dann die neuen Zeichenfolgen zurück.In this example, another extension method is introduced, AppendString, which appends a specified string onto every string in the source collection, and then yields the new strings.

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

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

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 diesem Beispiel können Sie sehen, dass jede Erweiterungsmethode für jedes Element in der Quellauflistung immer nur einmal gleichzeitig ausgeführt wird.In this example, you can see that each extension method operates one at a time for each item in the source collection.

In diesem Beispiel wird deutlich, dass auch dann, wenn Abfragen verkettet wurden, die Auflistungen zurückgeben, keine Materialisierung von Zwischenauflistungen erfolgt.What should be clear from this example is that even though we have chained together queries that yield collections, no intermediate collections are materialized. Stattdessen wird jedes Element von einer verzögerten Methode an die nächste übergeben.Instead, each item is passed from one lazy method to the next. Auf diese Weise wird wesentlich weniger Speicher beansprucht, als wenn zunächst ein Array von Zeichenfolgen hergenommen und dann ein zweites Array von Zeichenfolgen erstellt wird, die in Großbuchstaben umgewandelt werden, woraufhin schließlich ein drittes Array von Zeichenfolgen erstellt wird, in dem an jede Zeichenfolge das Ausrufezeichen angefügt wurde.This results in a much smaller memory footprint than an approach that would first take one array of strings, then create a second array of strings that have been converted to uppercase, and finally create a third array of strings where each string has the exclamation points appended to it.

Im nächsten Thema dieses Lernprogramms wird die Zwischenmaterialisierung erläutert:The next topic in this tutorial illustrates intermediate materialization:

Siehe auchSee Also

Tutorial: Verketten von Abfragen (C#)Tutorial: Chaining Queries Together (C#)