Opérations de projection (Visual Basic)
La projection désigne l’opération de transformation d’un objet en une nouvelle forme qui se compose souvent uniquement des propriétés à utiliser ensuite. À l'aide de la projection, vous pouvez créer un nouveau type qui est généré à partir de chaque objet. Vous pouvez projeter une propriété et effectuer une fonction mathématique sur celle-ci. Vous pouvez également projeter l’objet d’origine sans le modifier.
Les méthodes d’opérateurs de requête standard qui effectuent des opérations de projection sont répertoriées dans la section suivante.
Méthodes
Nom de la méthode | Description | Syntaxe de l'expression de requête en Visual Basic | Informations complémentaires |
---|---|---|---|
Sélectionnez | Projette les valeurs qui sont basées sur une fonction de transformation. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Projette les séquences de valeurs qui sont basées sur une fonction de transformation, puis les aplatit en une seule séquence. | Utilisation de plusieurs clauses From |
Enumerable.SelectMany Queryable.SelectMany |
Zip | Produit une séquence de tuples avec des éléments de 2 à 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 clause Select
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 clauses From
pour projeter tous les mots 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
Comparaison de Select et SelectMany
Les deux clauses Select()
et SelectMany()
retournent une valeur de résultat (ou des valeurs) à partir des valeurs sources. Select()
retourne une seule 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()
retourne 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 comme 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 par SelectMany()
pour créer une seule grande séquence.
Les deux illustrations suivantes montrent en quoi les actions de ces deux méthodes sont différentes d’un point de vue conceptuel. 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 de quelle manière Select()
retourne une collection qui a le même nombre d’éléments que la collection source.
Cette illustration montre de quelle façon SelectMany()
concatène la séquence intermédiaire de tableaux en une seule valeur de résultat final qui contient chaque valeur de chaque tableau intermédiaire.
Exemple de code
L’exemple suivant compare le comportement de Select()
et de SelectMany()
. Le code crée un « bouquet » de fleurs en prenant les éléments de chaque liste de noms de fleurs de la collection source. Dans cet exemple, la « valeur unique » que la fonction de transformation Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) utilise est elle-même une collection de valeurs. Cela nécessite d’utiliser la boucle For Each
supplémentaire pour é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
- System.Linq
- Vue d’ensemble des opérateurs de requête standard (Visual Basic)
- Select (clause)
- Guide pratique : combiner des données avec des jointures
- Comment remplir des collections d’objets issues de plusieurs sources (LINQ) (Visual Basic)
- Guide pratique : retourner un résultat de requête LINQ comme type spécifique
- Guide pratique : diviser un fichier en plusieurs fichiers à l’aide de groupes (LINQ) (Visual Basic)