Projektionsvorgänge (Visual Basic)
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. Mithilfe der Projektion können Sie einen neuen Typ erstellen, der aus den einzelnen Objekten erstellt wird. Sie können eine Eigenschaft projizieren und eine mathematische Funktion für sie ausführen. Sie können auch das ursprüngliche Objekt projizieren, ohne es zu ändern.
Die Methoden des Standardabfrageoperators, die Projektion ausführen, sind im folgenden Abschnitt aufgeführt.
Methoden
Methodenname | Beschreibung | Visual Basic-Abfrageausdruckssyntax | Weitere Informationen |
---|---|---|---|
Auswählen | Projektwerte, die auf einer Transform-Funktion 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. | Mehrere From -Klauseln verwenden |
Enumerable.SelectMany Queryable.SelectMany |
Zip | Erzeugt eine Tupelsequenz 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 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 die einzelnen Wörter aus den einzelnen Zeichenfolgen in eine 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 jeweils Select()
und SelectMany()
besteht darin, einen Ergebniswert (oder Werte) aus den Quellwerten zu erstellen. Select()
generiert einen Ergebniswert für jeden Quellwert. Das Ergebnis ist daher eine Auflistung, die über die gleiche Anzahl von Elementen wie die Quellauflistung verfügt. Im Gegensatz dazu erzeugt SelectMany()
ein einziges Gesamtergebnis, das verkettete untergeordnete Auflistungen aus jedem Quellwert enthält. Die Transform-Funktion, die als Argument an SelectMany()
übergeben wird, muss eine aufzählbare Sequenz von Werten für jeden Quellwert zurückgeben. Diese aufzählbaren Sequenzen werden anschließend von SelectMany()
zu einer großen Sequenz verkettet.
Die folgenden zwei Abbildungen zeigen den konzeptionellen Unterschied zwischen den Aktionen der beiden Methoden. In jedem Fall wird davon ausgegangen, dass die Auswahlfunktion (Transform) das Array von Blumen aus jedem Quellwert auswählt.
Die Abbildung zeigt, wie Select()
eine Auflistung zurückgibt, die über die gleiche Anzahl von Elementen wie die Quellauflistung verfügt.
Diese Abbildung zeigt, wie SelectMany()
die Zwischenmodus-Sequenz von Arrays in einem Endergebniswert verkettet, der jeden Wert aus jedem Zwischenmodus-Array enthält.
Codebeispiel
Im folgenden Beispiel wird das Verhalten von Select()
und SelectMany()
verglichen. Der Code erstellt anhand der Elemente aus jeder Liste von Blumennamen in der Quellauflistung einen „Blumenstrauß“. In diesem Beispiel ist der „einzelne Wert“, den die Transformationsfunktion Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) verwendet, selbst eine Auflistung von Werten. Dies erfordert die zusätzliche For Each
-Schleife, um jede Zeichenfolge in den einzelnen Untersequenzen aufzulisten.
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
- System.Linq
- Standard Query Operators Overview (Visual Basic) (Übersicht über Standardabfrageoperatoren (Visual Basic))
- Select-Klausel
- Kombinieren von Daten mithilfe von Joins
- Vorgehensweise: Auffüllen von Objektsammlungen mit Daten aus mehreren Quellen (LINQ) (Visual Basic)
- Vorgehensweise: Zurückgeben eines LINQ-Abfrageergebnisses als bestimmter Typ
- Vorgehensweise: Aufteilen einer Datei in mehrere Dateien mithilfe von Gruppen (LINQ) (Visual Basic)