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.

Graphic that shows the action of Select()

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.

Graphic showing the action of SelectMany().

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ż