Projectiebewerkingen (Visual Basic)
Projectie verwijst naar de werking van het transformeren van een object in een nieuwe vorm die vaak alleen bestaat uit die eigenschappen die vervolgens worden gebruikt. Met behulp van projectie kunt u een nieuw type maken dat is gebouwd op basis van elk object. U kunt een eigenschap projecten en er een wiskundige functie op uitvoeren. U kunt het oorspronkelijke object ook projecten zonder het te wijzigen.
De standaardqueryoperatormethoden die projectie uitvoeren, worden weergegeven in de volgende sectie.
Methoden
Methodenaam | Beschrijving | Syntaxis van Visual Basic-queryexpressie | Meer informatie |
---|---|---|---|
Select | Projecten die zijn gebaseerd op een transformatiefunctie. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Projectenreeksen van waarden die zijn gebaseerd op een transformatiefunctie en vervolgens platmaken in één reeks. | Meerdere From componenten gebruiken |
Enumerable.SelectMany Queryable.SelectMany |
Postcode | Produceert een reeks tuples met elementen uit 2-3 opgegeven reeksen. | Niet van toepassing. | Enumerable.Zip Queryable.Zip |
Voorbeelden van syntaxis van query-expressie
Select
In het volgende voorbeeld wordt de Select
component gebruikt om de eerste letter van elke tekenreeks in een lijst met tekenreeksen te projecteren.
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
In het volgende voorbeeld worden meerdere From
componenten gebruikt om elk woord uit elke tekenreeks te projecteren in een lijst met tekenreeksen.
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
Selecteren versus SelectMany
Het werk van beide Select()
en SelectMany()
is het produceren van een resultaatwaarde (of waarden) van bronwaarden. Select()
produceert één resultaatwaarde voor elke bronwaarde. Het algehele resultaat is daarom een verzameling met hetzelfde aantal elementen als de bronverzameling. Produceert daarentegen SelectMany()
één algemeen resultaat dat samengevoegde subverzamelingen van elke bronwaarde bevat. De transformatiefunctie die als argument SelectMany()
wordt doorgegeven, moet een opsommingsvolgorde van waarden retourneren voor elke bronwaarde. Deze enumerable reeksen worden vervolgens samengevoegd door SelectMany()
één grote reeks te maken.
In de volgende twee illustraties ziet u het conceptuele verschil tussen de acties van deze twee methoden. In elk geval wordt ervan uitgegaan dat de functie selector (transformatie) de matrix met bloemen uit elke bronwaarde selecteert.
In deze afbeelding ziet u hoe Select()
een verzameling met hetzelfde aantal elementen wordt geretourneerd als de bronverzameling.
In deze afbeelding ziet u hoe SelectMany()
u de tussenliggende reeks matrices samenvoegt in één uiteindelijke resultaatwaarde die elke waarde van elke tussenliggende matrix bevat.
Codevoorbeeld
In het volgende voorbeeld wordt het gedrag van Select()
en SelectMany()
. De code maakt een 'boeket' van bloemen door de items uit elke lijst met bloemnamen in de bronverzameling te nemen. In dit voorbeeld is de 'enkele waarde' die door de transformatiefunctie Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) wordt gebruikt, een verzameling waarden. Hiervoor is de extra For Each
lus vereist om elke tekenreeks in elke subreeks te inventariseren.
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
Zie ook
- System.Linq
- Overzicht van Standard-queryoperators (Visual Basic)
- Component selecteren
- Procedure: Gegevens combineren met joins
- Procedure: Objectverzamelingen uit meerdere bronnen (LINQ) vullen (Visual Basic)
- Procedure: een LINQ-queryresultaat retourneren als een specifiek type
- Procedure: Een bestand splitsen in veel bestanden met behulp van groepen (LINQ) (Visual Basic)