Projektionsvorgänge (C#)Projection Operations (C#)

Projektion bezieht sich auf einen Vorgang, bei dem ein Objekt in eine neue Form transformiert wird, die häufig nur aus den Eigenschaften besteht, die anschließend verwendet werden.Projection refers to the operation of transforming an object into a new form that often consists only of those properties that will be subsequently used. Mithilfe der Projektion können Sie einen neuen Typ erstellen, der aus den einzelnen Objekten erstellt wird.By using projection, you can construct a new type that is built from each object. Sie können eine Eigenschaft projizieren und eine mathematische Funktion für sie ausführen.You can project a property and perform a mathematical function on it. Sie können auch das ursprüngliche Objekt projizieren, ohne es zu ändern.You can also project the original object without changing it.

Die Methoden des Standardabfrageoperators, die Projektion ausführen, sind im folgenden Abschnitt aufgeführt.The standard query operator methods that perform projection are listed in the following section.

MethodenMethods

MethodennameMethod Name descriptionDescription C#-AbfrageausdruckssyntaxC# Query Expression Syntax Weitere InformationenMore Information
AuswählenSelect Projektwerte, die auf einer Transform-Funktion basieren.Projects values that are based on a transform function. select Enumerable.Select

Queryable.Select
SelectManySelectMany Projiziert Sequenzen von Werten, die auf einer Transform-Funktion basieren, und fasst diese dann in eine Sequenz zusammen.Projects sequences of values that are based on a transform function and then flattens them into one sequence. Mehrere from-Klauseln verwendenUse multiple from clauses Enumerable.SelectMany

Queryable.SelectMany

Beispiele für die AbfrageausdruckssyntaxQuery Expression Syntax Examples

AuswählenSelect

Im folgenden Beispiel wird die select-Klausel verwendet, um den ersten Buchstaben jeder Zeichenfolge in einer Liste von Zeichenfolgen zu projizieren.The following example uses the select clause to project the first letter from each string in a list of strings.

List<string> words = new List<string>() { "an", "apple", "a", "day" };  

var query = from word in words  
            select word.Substring(0, 1);  

foreach (string s in query)  
    Console.WriteLine(s);  

/* This code produces the following output:  

    a  
    a  
    a  
    d  
*/  

SelectManySelectMany

Im folgenden Beispiel wird die from-Klausel verwendet, um jedes Wort aus jeder Zeichenfolge in einer Liste von Zeichenfolgen zu projizieren.The following example uses multiple from clauses to project each word from each string in a list of strings.

List<string> phrases = new List<string>() { "an apple a day", "the quick brown fox" };  

var query = from phrase in phrases  
            from word in phrase.Split(' ')  
            select word;  

foreach (string s in query)  
    Console.WriteLine(s);  

/* This code produces the following output:  

    an  
    apple  
    a  
    day  
    the  
    quick  
    brown  
    fox  
*/  

Select im Vergleich zu SelectManySelect versus SelectMany

Die Arbeit von jeweils Select() und SelectMany() besteht darin, einen Ergebniswert (oder Werte) aus den Quellwerten zu erstellen.The work of both Select() and SelectMany() is to produce a result value (or values) from source values. Select() generiert einen Ergebniswert für jeden Quellwert.Select() produces one result value for every source value. Das Ergebnis ist daher eine Auflistung, die über die gleiche Anzahl von Elementen wie die Quellauflistung verfügt.The overall result is therefore a collection that has the same number of elements as the source collection. Im Gegensatz dazu erzeugt SelectMany() ein einziges Gesamtergebnis, das verkettete untergeordnete Auflistungen aus jedem Quellwert enthält.In contrast, SelectMany() produces a single overall result that contains concatenated sub-collections from each source value. Die Transform-Funktion, die als Argument an SelectMany() übergeben wird, muss eine aufzählbare Sequenz von Werten für jeden Quellwert zurückgeben.The transform function that is passed as an argument to SelectMany() must return an enumerable sequence of values for each source value. Diese aufzählbaren Sequenzen werden anschließend von SelectMany() zu einer großen Sequenz verkettet.These enumerable sequences are then concatenated by SelectMany() to create one large sequence.

Die folgenden zwei Abbildungen zeigen den konzeptionellen Unterschied zwischen den Aktionen der beiden Methoden.The following two illustrations show the conceptual difference between the actions of these two methods. In jedem Fall wird davon ausgegangen, dass die Auswahlfunktion (Transform) das Array von Blumen aus jedem Quellwert auswählt.In each case, assume that the selector (transform) function selects the array of flowers from each source value.

Die Abbildung zeigt, wie Select() eine Auflistung zurückgibt, die über die gleiche Anzahl von Elementen wie die Quellauflistung verfügt.This illustration depicts how Select() returns a collection that has the same number of elements as the source collection.

Konzeptionelle Abbildung der Aktion Select()Conceptual illustration of the action of Select()

Diese Abbildung zeigt, wie SelectMany() die Zwischenmodus-Sequenz von Arrays in einem Endergebniswert verkettet, der jeden Wert aus jedem Zwischenmodus-Array enthält.This illustration depicts how SelectMany() concatenates the intermediate sequence of arrays into one final result value that contains each value from each intermediate array.

Grafische Darstellung der Aktion SelectMany().Graphic showing the action of SelectMany().

CodebeispielCode Example

Im folgenden Beispiel wird das Verhalten von Select() und SelectMany() verglichen.The following example compares the behavior of Select() and SelectMany(). Der Code erstellt eine „Bouquet“ von Blumen, indem er die ersten beiden Elemente aus jeder Liste der Blumennamen in der Quellauflistung aufführt.The code creates a "bouquet" of flowers by taking the first two items from each list of flower names in the source collection. In diesem Beispiel ist der „einzelne Wert“, den die Transformationsfunktion Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) verwendet, selbst eine Auflistung von Werten.In this example, the "single value" that the transform function Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) uses is itself a collection of values. Dies erfordert die zusätzliche foreach-Schleife, um jede Zeichenfolge in den einzelnen Untersequenzen aufzulisten.This requires the extra foreach loop in order to enumerate each string in each sub-sequence.

class Bouquet  
{  
    public List<string> Flowers { get; set; }  
}  

static void SelectVsSelectMany()  
{  
    List<Bouquet> bouquets = new List<Bouquet>() {  
        new Bouquet { Flowers = new List<string> { "sunflower", "daisy", "daffodil", "larkspur" }},  
        new Bouquet{ Flowers = new List<string> { "tulip", "rose", "orchid" }},  
        new Bouquet{ Flowers = new List<string> { "gladiolis", "lily", "snapdragon", "aster", "protea" }},  
        new Bouquet{ Flowers = new List<string> { "larkspur", "lilac", "iris", "dahlia" }}  
    };  

    // *********** Select ***********              
    IEnumerable<List<string>> query1 = bouquets.Select(bq => bq.Flowers);  

    // ********* SelectMany *********  
    IEnumerable<string> query2 = bouquets.SelectMany(bq => bq.Flowers);  

    Console.WriteLine("Results by using Select():");  
    // Note the extra foreach loop here.  
    foreach (IEnumerable<String> collection in query1)  
        foreach (string item in collection)  
            Console.WriteLine(item);  

    Console.WriteLine("\nResults by using SelectMany():");  
    foreach (string item in query2)  
        Console.WriteLine(item);  

    /* This code produces the following output:  

       Results by using Select():  
        sunflower  
        daisy  
        daffodil  
        larkspur  
        tulip  
        rose  
        orchid  
        gladiolis  
        lily  
        snapdragon  
        aster  
        protea  
        larkspur  
        lilac  
        iris  
        dahlia  

       Results by using SelectMany():  
        sunflower  
        daisy  
        daffodil  
        larkspur  
        tulip  
        rose  
        orchid  
        gladiolis  
        lily  
        snapdragon  
        aster  
        protea  
        larkspur  
        lilac  
        iris  
        dahlia  
    */  

}  

Siehe auchSee Also

System.Linq
Standard Query Operators Overview (C#) (Übersicht der Standardabfrageoperatoren (C#))Standard Query Operators Overview (C#)
select-Klauselselect clause
Vorgehensweise: Füllen von Objektauflistungen aus mehreren Quellen (LINQ) (C#)How to: Populate Object Collections from Multiple Sources (LINQ) (C#)
Vorgehensweise: Teilen einer Datei in mehrere Dateien durch das Verwenden von Gruppen (LINQ) (C#)How to: Split a File Into Many Files by Using Groups (LINQ) (C#)