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.
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.
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é
- System.Linq
- Přehled standardních operátorů dotazů (Visual Basic)
- Klauzule Select
- Postupy: Kombinování dat s spojeními
- Postupy: Naplnění kolekcí objektů z více zdrojů (LINQ) (Visual Basic)
- Postupy: Vrácení výsledku dotazu LINQ jako specifického typu
- Postupy: Rozdělení souboru do mnoha souborů pomocí skupin (LINQ) (Visual Basic)