Freigeben über


Projektionsvorgänge (Visual Basic)

Projektion bezieht sich auf den Vorgang der Transformation eines Objekts in eine neue Form, die häufig nur aus diesen Eigenschaften besteht, die anschließend verwendet werden. Mithilfe der Projektion können Sie einen neuen Typ erstellen, der aus jedem Objekt erstellt wird. Sie können eine Eigenschaft projizieren und eine mathematische Funktion darauf ausführen. Sie können das ursprüngliche Objekt auch projizieren, ohne es zu ändern.

Die Standardmäßigen Abfrageoperatormethoden, die Projektion ausführen, sind im folgenden Abschnitt aufgeführt.

Methodik

Methodenname BESCHREIBUNG Syntax des Visual Basic-Abfrageausdrucks Mehr Informationen
Auswählen Projiziert Werte, die auf einer Transformationsfunktion basieren. Select Enumerable.Select

Queryable.Select
SelectMany Projiziert Sequenzen von Werten, die auf einer Transform-Funktion basieren, und fasst diese dann in eine Sequenz zusammen. Verwenden mehrerer From Klauseln Enumerable.SelectMany

Queryable.SelectMany
Schwirren Erzeugt eine Abfolge von Tupeln mit Elementen aus 2-3 angegebenen Sequenzen. Nicht zutreffend. Enumerable.Zip
Queryable.Zip

Beispiele für die Abfrageausdruckssyntax

Auswählen

Im folgenden Beispiel wird die Select Klausel verwendet, um den ersten Buchstaben aus jeder Zeichenfolge in einer Liste von Zeichenfolgen zu projizieren.

Dim words = New List(Of String) From {"an", "apple", "a", "day"}

Dim query = From word In words
            Select word.Substring(0, 1)

Dim sb As New System.Text.StringBuilder()
For Each letter As String In query
    sb.AppendLine(letter)
Next

' Display the output.
MsgBox(sb.ToString())

' This code produces the following output:

' a
' a
' a
' d

SelectMany

Im folgenden Beispiel werden mehrere From Klauseln verwendet, um jedes Wort aus jeder Zeichenfolge in einer Liste von Zeichenfolgen zu projizieren.

Dim phrases = New List(Of String) From {"an apple a day", "the quick brown fox"}

Dim query = From phrase In phrases
            From word In phrase.Split(" "c)
            Select word

Dim sb As New System.Text.StringBuilder()
For Each str As String In query
    sb.AppendLine(str)
Next

' Display the output.
MsgBox(sb.ToString())

' This code produces the following output:

' an
' apple
' a
' day
' the
' quick
' brown
' fox

Select im Vergleich zu SelectMany

Die Arbeit von beiden Select() und SelectMany() besteht darin, einen Ergebniswert (oder Werte) aus Quellwerten zu erzeugen. Select() erzeugt einen Ergebniswert für jeden Quellwert. Das Gesamtergebnis ist daher eine Auflistung mit der gleichen Anzahl von Elementen wie die Quellauflistung. Im Gegensatz dazu erzeugt SelectMany() ein einziges Gesamtergebnis, das verkettete Unterkollektionen aus jedem Quellwert enthält. Die Transformationsfunktion, die als Argument an SelectMany() übergeben wird, muss eine aufzählbare Abfolge von Werten für jeden Quellwert zurückgeben. Diese aufzählbaren Sequenzen werden dann mit SelectMany() verkettet, um eine große Sequenz zu erstellen.

Die folgenden beiden Abbildungen zeigen den konzeptionellen Unterschied zwischen den Aktionen dieser beiden Methoden. Gehen Sie in jedem Fall davon aus, dass die Selektorfunktion (Transformation) das Array von Blumen aus jedem Quellwert auswählt.

Diese Abbildung zeigt, wie Select() eine Auflistung zurückgegeben wird, die dieselbe Anzahl von Elementen wie die Quellauflistung aufweist.

Grafik, die die Aktion von Select() zeigt

In dieser Abbildung wird dargestellt, wie SelectMany() die Zwischenabfolge von Arrays in einen Endergebniswert verkettet wird, der jeden Wert aus jedem Zwischenarray enthält.

Grafik mit der Aktion von SelectMany().

Codebeispiel

Im folgenden Beispiel wird das Verhalten von Select() und SelectMany() verglichen. Der Code erstellt ein "Blumenstrauß", indem die Elemente aus jeder Liste der Blumennamen in der Quellsammlung entnommen werden. In diesem Beispiel ist der von der Transformationsfunktion Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) verwendete Einzelne Wert selbst eine Sammlung von Werten. Dies erfordert die zusätzliche For Each Schleife, um jede Zeichenfolge in jeder Untersequenz aufzählen zu können.

Class Bouquet
    Public Flowers As List(Of String)
End Class

Sub SelectVsSelectMany()
    Dim bouquets = New List(Of Bouquet) From {
        New Bouquet With {.Flowers = New List(Of String)(New String() {"sunflower", "daisy", "daffodil", "larkspur"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"tulip", "rose", "orchid"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"gladiolis", "lily", "snapdragon", "aster", "protea"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"larkspur", "lilac", "iris", "dahlia"})}}

    Dim output As New System.Text.StringBuilder

    ' Select()
    Dim query1 = bouquets.Select(Function(b) b.Flowers)

    output.AppendLine("Using Select():")
    For Each flowerList In query1
        For Each str As String In flowerList
            output.AppendLine(str)
        Next
    Next

    ' SelectMany()
    Dim query2 = bouquets.SelectMany(Function(b) b.Flowers)

    output.AppendLine(vbCrLf & "Using SelectMany():")
    For Each str As String In query2
        output.AppendLine(str)
    Next

    ' Display the output
    MsgBox(output.ToString())

    ' This code produces the following output:
    '
    ' Using Select():
    ' sunflower
    ' daisy
    ' daffodil
    ' larkspur
    ' tulip
    ' rose
    ' orchid
    ' gladiolis
    ' lily
    ' snapdragon
    ' aster
    ' protea
    ' larkspur
    ' lilac
    ' iris
    ' dahlia

    ' Using SelectMany()
    ' sunflower
    ' daisy
    ' daffodil
    ' larkspur
    ' tulip
    ' rose
    ' orchid
    ' gladiolis
    ' lily
    ' snapdragon
    ' aster
    ' protea
    ' larkspur
    ' lilac
    ' iris
    ' dahlia

End Sub

Siehe auch