Projektionsåtgärder (Visual Basic)
Projektion refererar till hur ett objekt omvandlas till ett nytt formulär som ofta endast består av de egenskaper som senare ska användas. Med hjälp av projektion kan du skapa en ny typ som skapas från varje objekt. Du kan projicera en egenskap och utföra en matematisk funktion på den. Du kan också projicera det ursprungliga objektet utan att ändra det.
Standardmetoderna för frågeoperatorer som utför projektion visas i följande avsnitt.
Metoder
Metodnamn | beskrivning | Syntax för Visual Basic-frågeuttryck | Mer information |
---|---|---|---|
Välj | Projektvärden som baseras på en transformeringsfunktion. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Projektsekvenser med värden som baseras på en transformeringsfunktion och sedan platta ut dem till en enda sekvens. | Använda flera From satser |
Enumerable.SelectMany Queryable.SelectMany |
Postnummer | Genererar en sekvens med tupplar med element från 2–3 angivna sekvenser. | Ej tillämpbart. | Enumerable.Zip Queryable.Zip |
Exempel på frågeuttryckssyntax
Välj
I följande exempel används Select
-satsen för att projicera den första bokstaven från varje sträng i en lista med strängar.
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
I följande exempel används flera From
satser för att projicera varje ord från varje sträng i en lista med strängar.
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älj jämfört med SelectMany
Arbetet med båda Select()
och SelectMany()
är att skapa ett resultatvärde (eller värden) från källvärden. Select()
genererar ett resultatvärde för varje källvärde. Det övergripande resultatet är därför en samling som har samma antal element som källsamlingen. Ger däremot SelectMany()
ett enda övergripande resultat som innehåller sammanfogade undersamlingar från varje källvärde. Transformeringsfunktionen som skickas som ett argument till SelectMany()
måste returnera en uppräkningsbar sekvens med värden för varje källvärde. Dessa uppräkningsbara sekvenser sammanfogas sedan av SelectMany()
för att skapa en stor sekvens.
Följande två illustrationer visar den konceptuella skillnaden mellan åtgärderna för dessa två metoder. Anta i varje fall att väljaren (transformeringsfunktionen) väljer matrisen med blommor från varje källvärde.
Den här bilden visar hur Select()
returnerar en samling som har samma antal element som källsamlingen.
Den här bilden visar hur SelectMany()
sammanlänkar den mellanliggande sekvensen av matriser till ett slutligt resultatvärde som innehåller varje värde från varje mellanliggande matris.
Kodexempel
I följande exempel jämförs beteendet Select()
för och SelectMany()
. Koden skapar en "bukett" av blommor genom att ta objekten från varje lista med blomnamn i källsamlingen. I det här exemplet är det "enda värde" som transformeringsfunktionen Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) använder i sig en samling värden. Detta kräver den extra For Each
loopen för att räkna upp varje sträng i varje undersekvens.
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
Se även
- System.Linq
- Översikt över vanliga frågeoperatorer (Visual Basic)
- Välj sats
- Anvisningar: Kombinera data med kopplingar
- Så här fyller du i objektsamlingar från flera källor (LINQ) (Visual Basic)
- Anvisningar: Returnera ett LINQ-frågeresultat som en specifik typ
- Anvisningar: Dela upp en fil i många filer med hjälp av grupper (LINQ) (Visual Basic)