Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 | Wartości projektów oparte na funkcji transform. | Select |
Enumerable.Select Queryable.Select |
| Wybierz wiele | Projektują sekwencje wartości z wykorzystaniem funkcji przekształcania, a następnie spłaszcza je w jedną sekwencję. | Używanie wielu From klauzul |
Enumerable.SelectMany Queryable.SelectMany |
| ZIP | Tworzy sekwencję krotek z elementów z 2–3 określonych sekwencji. | Nie dotyczy. | Enumerable.Zip Queryable.Zip |
Przykłady składni wyrażeń zapytania
Wybierz
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
Wybierz wiele
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 a wybieranieWiele
Praca obu Select() i SelectMany() polega na tworzeniu wartości wynikowej (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 przez SelectMany(), aby utworzyć jedną dużą sekwencję.
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 wyboru (transformacji) 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órej korzysta funkcja transformacji Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>), sama w sobie jest zbiorem 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 także
- System.Linq
- Omówienie standardowych operatorów zapytań (Visual Basic)
- Klauzula wybierz
- 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)