Partager via


Opérations de projection (Visual Basic)

La projection fait référence à l’opération de transformation d’un objet en un nouveau formulaire qui se compose souvent uniquement de ces propriétés qui seront ensuite utilisées. À l’aide de la projection, vous pouvez construire un nouveau type généré à partir de chaque objet. Vous pouvez projeter une propriété et y effectuer une fonction mathématique. Vous pouvez également projeter l’objet d’origine sans le modifier.

Les méthodes d’opérateur de requête standard qui effectuent une projection sont répertoriées dans la section suivante.

Méthodes

Nom de la méthode Descriptif Syntaxe de l’expression de requête Visual Basic Plus d’informations
Sélectionnez Projette des valeurs qui sont basées sur une fonction de transformation. Select Enumerable.Select

Queryable.Select
SelectMany Projette des séquences de valeurs basées sur une fonction de transformation, puis les aplatit en une seule séquence. Utiliser plusieurs From clauses Enumerable.SelectMany

Queryable.SelectMany
Fermeture éclair Produit une séquence de tuples dont les éléments proviennent de 2 ou 3 séquences spécifiées. Non applicable. Enumerable.Zip
Queryable.Zip

Exemples de syntaxe d’expression de requête

Sélectionnez

L’exemple suivant utilise la Select clause pour projeter la première lettre de chaque chaîne dans une liste de chaînes.

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

L’exemple suivant utilise plusieurs From clauses pour projeter chaque mot de chaque chaîne dans une liste de chaînes.

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

Sélectionner par rapport à SelectMany

Le travail des deux Select() et SelectMany() consiste à produire une valeur de résultat (ou des valeurs) à partir de valeurs sources. Select() produit une valeur de résultat pour chaque valeur source. Le résultat global est donc une collection qui a le même nombre d’éléments que la collection source. En revanche, SelectMany() produit un résultat global unique qui contient des sous-collections concaténées à partir de chaque valeur source. La fonction de transformation qui est passée en tant qu'argument à SelectMany() doit retourner une séquence énumérable de valeurs pour chaque valeur source. Ces séquences énumérables sont ensuite concaténées SelectMany() pour créer une grande séquence.

Les deux illustrations suivantes montrent la différence conceptuelle entre les actions de ces deux méthodes. Dans chaque cas, supposons que la fonction (de transformation) du sélecteur sélectionne le tableau de fleurs (Flowers) à partir de chaque valeur source.

Cette illustration montre comment Select() retourne une collection qui a le même nombre d’éléments que la collection source.

Graphique montrant l’action Select()

Cette illustration montre comment SelectMany() concaténer la séquence intermédiaire de tableaux en une valeur de résultat finale qui contient chaque valeur de chaque tableau intermédiaire.

Graphique montrant l’action de SelectMany().

Exemple de code

L’exemple suivant compare le comportement de Select() et SelectMany(). Le code crée un « bouquet » de fleurs en prenant les éléments de chaque liste de noms de fleurs dans la collection source. Dans cet exemple, la « valeur unique » utilisée par la fonction Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) de transformation est elle-même une collection de valeurs. Cela nécessite la boucle supplémentaire For Each afin d’énumérer chaque chaîne dans chaque sous-séquence.

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

Voir aussi