Verketten von Standardabfrageoperatoren (C#)Chaining Standard Query Operators Together (C#)

Dies ist das letzte Thema von Tutorial: Verketten von Abfragen (C#).This is the final topic in the Tutorial: Chaining Queries Together (C#) tutorial.

Die Standardabfrageoperatoren können ebenfalls verkettet werden.The standard query operators can also be chained together. So können Sie z. B. den Enumerable.Where-Operator verwenden; dieser funktioniert ebenfalls verzögert.For example, you can interject the Enumerable.Where operator, and it also operates in a lazy fashion. Er materialisiert keinerlei Zwischenergebnisse.No intermediate results are materialized by it.

BeispielExample

In diesem Beispiel wird die Where-Methode aufgerufen, bevor ConvertCollectionToUpperCase aufgerufen wird.In this example, the Where method is called before calling ConvertCollectionToUpperCase. Die Where-Methode funktioniert fast genauso wie die in den vorherigen Beispielen dieses Lernprogramms verwendeten verzögerten Methoden ConvertCollectionToUpperCase und AppendString.The Where method operates in almost exactly the same way as the lazy methods used in previous examples in this tutorial, ConvertCollectionToUpperCase and AppendString.

Ein Unterschied besteht darin, dass die Where-Methode in diesem Fall ihre Quellauflistung durchläuft, dabei feststellt, dass das erste Element kein Prädikat übergibt, und dann zum nächsten Element geht, das ein Prädikat übergibt.One difference is that in this case, the Where method iterates through its source collection, determines that the first item does not pass the predicate, and then gets the next item, which does pass. Anschließend gibt die Methode das zweite Element zurück.It then yields the second item.

Die Grundidee ist aber dieselbe: Zwischenauflistungen werden nur dann materialisiert, wenn dies erforderlich ist.However, the basic idea is the same: Intermediate collections are not materialized unless they have to be.

Bei Verwendung von Abfrageausdrücken werden diese in Aufrufe für die Standardabfrageoperatoren umgewandelt, und es werden dieselben Prinzipien angewendet.When query expressions are used, they are converted to calls to the standard query operators, and the same principles apply.

Alle Beispiele in diesem Abschnitt, die Office Open-XML-Dokumente abfragen, verwenden dasselbe Prinzip.All of the examples in this section that are querying Office Open XML documents use the same principle. Die verzögerte Ausführung und die verzögerte Auswertung sind nur zwei der grundlegenden Konzepte, mit denen Sie vertraut sein müssen, um LINQ (und LINQ to XML) effektiv nutzen zu können.Deferred execution and lazy evaluation are some of the fundamental concepts that you must understand to use LINQ (and LINQ to XML) effectively.

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()  
            where s.CompareTo("D") >= 0  
            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<  
ToUpper: source >def<  
AppendString: source >DEF<  
Main: str >DEF!!!<  

ToUpper: source >ghi<  
AppendString: source >GHI<  
Main: str >GHI!!!<  

Siehe auchSee Also

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