Condividi tramite


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.

Graphic that shows the action of Select()

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.

Graphic showing the action of SelectMany().

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