Operações de projeção (Visual Basic)
Projeção refere-se à operação de transformar um objeto em uma nova forma que muitas vezes consiste apenas nas propriedades que serão posteriormente usadas. Usando projeção, você pode construir um novo tipo que é construído 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 estão listados na seção a seguir.
Métodos
Nome do método | Description | Sintaxe da expressão de consulta do Visual Basic | Mais Informações |
---|---|---|---|
Selecione | Projeta valores baseados em uma função de transformação. | Select |
Enumerable.Select Queryable.Select |
SelecionarMuitos | Projeta sequências de valores que se baseiam em uma função de transformação e, em seguida, as nivela em uma sequência. | Usar várias From cláusulas |
Enumerable.SelectMany Queryable.SelectMany |
Código Postal | Produz uma sequência de tuplas com elementos de 2-3 sequências especificadas. | Não aplicável. | Enumerable.Zip Queryable.Zip |
Exemplos de sintaxe de expressão de consulta
Selecione
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
SelecionarMuitos
O exemplo a seguir usa várias From
cláusulas 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 SelecionarMuitos
O trabalho de ambos Select()
e SelectMany()
é produzir um valor de resultado (ou valores) a partir 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. Em contraste, SelectMany()
produz um único resultado geral que contém subcoleções concatenadas de cada valor de origem. A função transform 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 então concatenadas para SelectMany()
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, suponha que a função seletor (transformar) 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.
Esta ilustração mostra 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.
Exemplo de código
O exemplo a seguir compara o comportamento de Select()
e SelectMany()
. O código cria um "buquê" de flores pegando os itens de cada lista de nomes de flores na coleção de origem. Neste exemplo, o "valor único" que a função Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) de transformação usa é em si uma coleção de valores. Isso requer o loop extra For Each
para enumerar cada string em cada subsequê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
- System.Linq
- Visão geral dos operadores de consulta padrão (Visual Basic)
- Selecionar cláusula
- Como: Combinar dados com associações
- Como preencher coleções de objetos de várias fontes (LINQ) (Visual Basic)
- Como: retornar um resultado de consulta LINQ como um tipo específico
- Como: Dividir um arquivo em muitos arquivos usando grupos (LINQ) (Visual Basic)