Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 | Promítá sekvence hodnot založené na transformační funkci a následně je zploští do jedné sekvence. | Použití více From klauzulí |
Enumerable.SelectMany Queryable.SelectMany |
| ZIP | Vytvoří sekvenci n-tic s prvky ze 2 nebo 3 zadaných sekvencí. | Nelze použít. | 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 SelectMany() vytvoří jeden celkový výsledek, 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 tomu, aby bylo možné vyčíslit každý řetězec 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
- Standardní operátory dotazů – přehled (Visual Basic)
- Klauzule SELECT
- Postupy: Kombinování dat se spojeními
- Postupy: Naplnění kolekcí objektů z více zdrojů (LINQ) (Visual Basic)
- Postupy: Vrácení výsledku dotazu LINQ jako konkrétního typu
- Postupy: Rozdělení souboru do mnoha souborů pomocí skupin (LINQ) (Visual Basic)