Compartilhar via


Operações de projeção (Visual Basic)

A projeção refere-se à operação de transformação de um objeto em um novo formulário que geralmente consiste apenas nas propriedades que serão posteriormente usadas. Usando a projeção, você pode construir um novo tipo criado a partir de cada objeto. Você pode projetar uma propriedade e executar uma função matemática nela. Você também pode projetar o objeto original sem alterá-lo.

Os métodos de operador de consulta padrão que executam a projeção são listados na seção a seguir.

Métodos

Nome do método Descrição Sintaxe da expressão de consulta do Visual Basic Mais informações
Selecionar Projeta valores baseados em uma função de transformação. Select Enumerable.Select

Queryable.Select
SelectMany Projeta sequências de valores que são baseados em uma função de transformação e, em seguida, os nivela em uma sequência. Use várias cláusulas From Enumerable.SelectMany

Queryable.SelectMany
Nada Produz uma sequência de tuplas com elementos provenientes de 2 ou 3 sequências especificadas. Não aplicável. Enumerable.Zip
Queryable.Zip

Exemplos de sintaxe de expressão de consulta

Selecionar

O exemplo a seguir usa a Select cláusula para projetar a primeira letra de cada cadeia de caracteres em uma lista de cadeias de caracteres.

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

O exemplo a seguir usa várias cláusulas From para projetar cada palavra de cada cadeia de caracteres em uma lista de cadeias de caracteres.

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

Selecionar versus SelectMany

O trabalho de ambos Select() e SelectMany() é produzir um valor de resultado (ou valores) de valores de origem. Select() produz um valor de resultado para cada valor de origem. O resultado geral é, portanto, uma coleção que tem o mesmo número de elementos que a coleção de origem. Por outro lado, SelectMany() produz um único resultado geral que contém subconjuntos concatenadas de cada valor de origem. A função de transformação que é passada como um argumento para SelectMany() deve retornar uma sequência enumerável de valores para cada valor de origem. Essas sequências enumeráveis são concatenadas SelectMany() para criar uma sequência grande.

As duas ilustrações a seguir mostram a diferença conceitual entre as ações desses dois métodos. Em cada caso, presuma que a função de seletor (transformação) seleciona a matriz de flores de cada valor de origem.

Esta ilustração mostra como Select() retorna uma coleção que tem o mesmo número de elementos que a coleção de origem.

Gráfico que mostra a ação de Select()

Esta ilustração descreve como SelectMany() concatena a sequência intermediária de matrizes em um valor de resultado final que contém cada valor de cada matriz intermediária.

Gráfico mostrando a ação de SelectMany().

Exemplo de código

O exemplo a seguir compara o comportamento de Select() e SelectMany(). O código cria um "buquê" de flores tirando os itens de cada lista de nomes de flores na coleção de origem. Neste exemplo, o "valor único" usado pela função Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) de transformação é em si uma coleção de valores. Isso requer o loop extra For Each para enumerar cada cadeia de caracteres em cada sub-sequência.

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

Consulte também