Operacje projekcji (Visual Basic)
Projekcja odnosi się do operacji przekształcania obiektu w nową formę, która często składa się tylko z tych właściwości, które będą następnie używane. Za pomocą projekcji można utworzyć nowy typ utworzony na podstawie każdego obiektu. Można projektować właściwość i wykonywać na niej funkcję matematyczną. Można również projektować oryginalny obiekt bez jego zmiany.
Standardowe metody operatorów zapytań, które wykonują projekcję, są wymienione w poniższej sekcji.
Metody
Nazwa metody | opis | Składnia wyrażeń zapytań języka Visual Basic | Więcej informacji |
---|---|---|---|
Wybierz pozycję | Wartości projektów oparte na funkcji transform. | Select |
Enumerable.Select Queryable.Select |
Selectmany | Projekty sekwencje wartości opartych na funkcji przekształcania, a następnie spłaszczają je w jedną sekwencję. | Używanie wielu From klauzul |
Enumerable.SelectMany Queryable.SelectMany |
Zip | Tworzy sekwencję krotki z elementami z 2–3 określonych sekwencji. | Nie dotyczy. | Enumerable.Zip Queryable.Zip |
Przykłady składni wyrażeń zapytania
Wybierz pozycję
W poniższym przykładzie użyto klauzuli Select
do projekcji pierwszej litery z każdego ciągu na liście ciągów.
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
W poniższym przykładzie użyto wielu From
klauzul do projekcji każdego wyrazu z każdego ciągu na liście ciągów.
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
Wybieranie i wybieranieMany
Praca obu Select()
elementów i SelectMany()
polega na utworzeniu wartości wyniku (lub wartości) z wartości źródłowych. Select()
tworzy jedną wartość wyniku dla każdej wartości źródłowej. Ogólny wynik jest zatem kolekcją, która ma taką samą liczbę elementów jak kolekcja źródłowa. SelectMany()
Natomiast tworzy pojedynczy ogólny wynik zawierający łączenie podzbiórów z każdej wartości źródłowej. Funkcja transform, która jest przekazywana jako argument SelectMany()
, musi zwrócić sekwencję wyliczalną wartości dla każdej wartości źródłowej. Te sekwencje wyliczalne są następnie łączone w SelectMany()
celu utworzenia jednej dużej sekwencji.
Na poniższych dwóch ilustracjach przedstawiono koncepcyjną różnicę między akcjami tych dwóch metod. W każdym przypadku załóżmy, że funkcja selektora (przekształcania) wybiera tablicę kwiatów z każdej wartości źródłowej.
Ta ilustracja przedstawia sposób Select()
zwracania kolekcji zawierającej taką samą liczbę elementów jak kolekcja źródłowa.
Ta ilustracja przedstawia sposób SelectMany()
łączenia pośredniej sekwencji tablic w jedną ostateczną wartość wyniku zawierającą każdą wartość z każdej tablicy pośredniej.
Przykład kodu
Poniższy przykład porównuje zachowanie elementów Select()
i SelectMany()
. Kod tworzy "bukiet" kwiatów, biorąc elementy z każdej listy nazw kwiatów w kolekcji źródłowej. W tym przykładzie "pojedyncza wartość", z którego korzysta funkcja Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) transform, jest kolekcją wartości. Wymaga to dodatkowej For Each
pętli w celu wyliczenia każdego ciągu w każdej sekwencji podrzędnej.
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
Zobacz też
- System.Linq
- Omówienie standardowych operatorów zapytań (Visual Basic)
- Select, klauzula
- Instrukcje: łączenie danych ze sprzężeniami
- Porady: wypełnianie kolekcji obiektów z wielu źródeł (LINQ) (Visual Basic)
- Instrukcje: zwracanie wyniku zapytania LINQ jako określonego typu
- Porady: dzielenie pliku na wiele plików przy użyciu grup (LINQ) (Visual Basic)