Operazioni di proiezione (Visual Basic)
La proiezione si riferisce all'operazione di trasformazione di un oggetto in un nuovo form costituito spesso solo dalle proprietà che verranno usate successivamente. Utilizzando la proiezione, è possibile costruire un nuovo tipo compilato in base a ogni oggetto. È possibile proiettare una proprietà ed eseguirvi una funzione matematica. È anche possibile proiettare l'oggetto originale senza modificarlo.
Nella sezione seguente sono elencati i metodi dell'operatore query standard che eseguono la proiezione.
Metodi
Nome metodo | Descrizione | Sintassi delle espressioni di query di Visual Basic | Ulteriori informazioni |
---|---|---|---|
Seleziona | Proietta i valori che si basano su una funzione di trasformazione. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Proietta le sequenze di valori che si basano su una funzione di trasformazione semplificandoli in un'unica sequenza. | Usare più clausole From |
Enumerable.SelectMany Queryable.SelectMany |
CAP | Produce una sequenza di tuple con elementi da 2-3 sequenze specificate. | Non applicabile. | Enumerable.Zip Queryable.Zip |
Esempi di sintassi delle espressioni di query
Seleziona
L'esempio seguente usa la clausola Select
per proiettare la prima lettera di ogni stringa di un elenco di stringhe.
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'esempio seguente usa più clausole From
per proiettare tutte le parole di ogni stringa di un elenco di stringhe.
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
Confronto tra Select e SelectMany
La funzione di Select()
e SelectMany()
è produrre uno o più valori risultato dai valori di origine. Select()
produce un valore risultato per ogni valore di origine. Il risultato complessivo è pertanto una raccolta contenente lo stesso numero di elementi della raccolta di origine. Al contrario, SelectMany()
produce un singolo risultato complessivo che contiene sottoraccolte concatenate di ogni valore di origine. La funzione di trasformazione passata come argomento a SelectMany()
deve restituire una sequenza enumerabile di valori per ogni valore di origine. Queste sequenze enumerabili vengono quindi concatenate da SelectMany()
per creare un'unica grande sequenza.
Le due figure seguenti illustrano la differenza concettuale tra le azioni di questi due metodi. In ogni caso, si supponga che la funzione del selettore (trasformazione) selezioni la matrice di fiori di ogni valore di origine.
La figura mostra che Select()
restituisce una raccolta contenente lo stesso numero di elementi della raccolta di origine.
La figura mostra che SelectMany()
concatena la sequenza intermedia di matrici in un unico valore risultato finale contenente tutti i valori di ogni matrice intermedia.
Esempio di codice
L'esempio seguente confronta il comportamento di Select()
e SelectMany()
. Il codice crea un "bouquet" di fiori prendendo gli elementi di ogni elenco di nomi di fiori nella raccolta di origine. In questo esempio, il "valore singolo" usato dalla funzione di trasformazione Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) è anch'esso una raccolta di valori. Questo richiede il ciclo For Each
aggiuntivo in modo da enumerare tutte le stringhe di ogni sottosequenza.
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
Vedi anche
- System.Linq
- Panoramica degli operatori query standard (Visual Basic)
- Clausola Select
- Procedura: Combinare dati utilizzando join
- Procedura: Popolare le raccolte di oggetti da più origini (LINQ) (Visual Basic)
- Procedura: Restituire un risultato di query LINQ come tipo specifico
- Procedura: Suddividere un file in molti file usando i gruppi (LINQ) (Visual Basic)