Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La proiezione fa riferimento all'operazione di trasformazione di un oggetto in un nuovo formato che spesso è costituito solo da quelle proprietà che verranno usate successivamente. Usando la proiezione, è possibile costruire un nuovo tipo compilato da ogni oggetto. È possibile proiettare una proprietà ed eseguire una funzione matematica su di essa. È anche possibile proiettare l'oggetto originale senza modificarlo.
I metodi dell'operatore di query standard che eseguono la proiezione sono elencati nella sezione seguente.
Metodi
| Nome metodo | Descrizione | Sintassi delle espressioni di query di Visual Basic | Altre informazioni |
|---|---|---|---|
| Seleziona | Proietta valori basati su una funzione di trasformazione. | Select |
Enumerable.Select Queryable.Select |
| SelectMany | Proietta sequenze di valori basati su una funzione di trasformazione e quindi li appiattisce in un'unica sequenza. | Usare più From clausole |
Enumerable.SelectMany Queryable.SelectMany |
| Compressione ZIP | Producono una sequenza di tuple con elementi provenienti da 2 o 3 sequenze specificate. | Non applicabile. | Enumerable.Zip Queryable.Zip |
Esempi di sintassi delle espressioni di query
Seleziona
Nell'esempio seguente viene utilizzata la Select clausola per proiettare la prima lettera di ogni stringa in 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
Nell'esempio seguente vengono usate più From clausole per proiettare ogni parola di ogni stringa in 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
Selezionare rispetto a SelectMany
Il lavoro di Select() e SelectMany() consiste nel produrre uno o più valori di risultato dai valori di origine.
Select() produce un valore di risultato per ogni valore di origine. Il risultato complessivo è quindi una raccolta con lo stesso numero di elementi della raccolta di origine. Al contrario, SelectMany() produce un singolo risultato complessivo che contiene raccolte secondarie concatenate da 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 una sequenza di grandi dimensioni.
Le due illustrazioni seguenti illustrano la differenza concettuale tra le azioni di questi due metodi. In ogni caso, si supponga che la funzione selettore (transform) selezioni l'array di fiori da ciascun valore sorgente.
Questa figura illustra come Select() restituisce una raccolta con lo stesso numero di elementi della raccolta di origine.
Questa figura illustra come SelectMany() concatenare la sequenza intermedia di matrici in un valore finale del risultato che contiene ogni valore di ogni matrice intermedia.
Esempio di codice
Nell'esempio seguente viene confrontato il comportamento di Select() e SelectMany(). Il codice crea un "bouquet" di fiori prendendo gli elementi da ogni elenco di nomi di fiori nella raccolta di origine. In questo esempio, il "singolo valore" usato dalla funzione Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) di trasformazione è una raccolta di valori. Ciò richiede il ciclo aggiuntivo For Each per enumerare ogni stringa in ogni sotto-sequenza.
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
Vedere anche
- System.Linq
- Panoramica degli operatori di query standard (Visual Basic)
- Clausola Seleziona
- Procedura: Combinare dati con operazioni di join
- Guida: Popolare collezioni 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 tramite gruppi (LINQ) (Visual Basic)