Sdílet prostřednictvím


Operace projekce (Visual Basic)

Projekce odkazuje na operaci transformace objektu na nový formulář, který se často skládá pouze z vlastností, které budou následně použity. Pomocí projekce můžete vytvořit nový typ vytvořený z každého objektu. Vlastnost můžete projektovat a provádět s ní matematickou funkci. Můžete také projektovat původní objekt beze změny.

Standardní metody operátoru dotazu, které provádějí projekci, jsou uvedeny v následující části.

Metody

Název metody Popis Syntaxe výrazů dotazu jazyka Visual Basic Další informace
Vyberte Hodnoty projektů založené na transformační funkci Select Enumerable.Select

Queryable.Select
Selectmany Projekty sekvence hodnot, které jsou založeny na transformační funkci a pak je zploštějí do jedné sekvence. Použití více From klauzulí Enumerable.SelectMany

Queryable.SelectMany
PSČ Vytvoří sekvenci řazených kolekcí členů s prvky ze 2 až 3 zadaných sekvencí. Nevztahuje se. Enumerable.Zip
Queryable.Zip

Příklady syntaxe výrazů dotazů

Vyberte

Následující příklad pomocí Select klauzule projektuje první písmeno z každého řetězce v seznamu řetězců.

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

Následující příklad používá více From klauzulí k projektování každého slova z každého řetězce v seznamu řetězců.

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

Výběr versus SelectMany

Práce obou Select() a SelectMany() je vytvořit výslednou hodnotu (nebo hodnoty) ze zdrojových hodnot. Select() vytvoří jednu výslednou hodnotu pro každou zdrojnou hodnotu. Celkový výsledek je tedy kolekce, která má stejný počet prvků jako zdrojová kolekce. Naproti tomu vytvoří jeden celkový výsledek, SelectMany() který obsahuje zřetězené dílčí kolekce z každé zdrojové hodnoty. Transformační funkce, která je předána jako argument, SelectMany() musí vrátit výčet hodnot pro každou zdrojovou hodnotu. Tyto výčtové sekvence se pak zřetědí a SelectMany() vytvoří jednu velkou sekvenci.

Následující dva ilustrace ukazují koncepční rozdíl mezi akcemi těchto dvou metod. V každém případě předpokládejme, že funkce selektoru (transformace) vybere pole květin z každé zdrojové hodnoty.

Tento obrázek znázorňuje, jak Select() vrátí kolekci, která má stejný počet prvků jako zdrojová kolekce.

Graphic that shows the action of Select()

Tento obrázek znázorňuje, jak SelectMany() zřetězí průběžnou sekvenci polí do jedné konečné výsledné hodnoty, která obsahuje každou hodnotu z každého zprostředkujícího pole.

Graphic showing the action of SelectMany().

Příklad kódu

Následující příklad porovnává chování Select() a SelectMany(). Kód vytvoří "kytice" květin tím, že vezme položky z každého seznamu názvů květin ve zdrojové kolekci. V tomto příkladu je "jednoduchá hodnota", kterou transformační funkce Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) používá, sama o sobě kolekcí hodnot. K vytvoření výčtu každého řetězce v jednotlivých dílčích sekvencích to vyžaduje další For Each smyčku.

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

Viz také