Dela via


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.

Graphic that shows the action of Select()

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.

Graphic showing the action of SelectMany().

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