Share via


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.

Graphic that shows the action of Select()

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.

Graphic showing the action of SelectMany().

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