Condividi tramite


Operazioni di proiezione (Visual Basic)

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.

Immagine che mostra l'azione di Select()

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.

Immagine che mostra l'azione di SelectMany().

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