Operações de projeção
Projeção refere-se à operação de transformação de um objeto em um novo formulário que geralmente consiste somente aquelas propriedades que serão usadas subseqüentemente.Usando a projeção, você pode construir um novo tipo é criado a partir de cada objeto.É possível uma propriedade de projeto e executar uma função matemática nele.Você pode também o objeto original sem alterá-la do projeto.
Os métodos de operador de consulta padrão que executam projeção são listados na seção seguinte.
Métodos
Nome do método |
Descrição |
Sintaxe de expressão de consulta translation from VPE for Csharp |
Visual Basic Sintaxe de expressão de consulta |
Mais informações |
---|---|---|---|---|
Select |
Valores de projetos baseados em uma função de transformação. |
select |
Select |
|
SelectMany |
Projetos de seqüências de valores que sejam baseiam em uma função de transformação e, em seguida, nivela-los em uma sequência. |
Usar vários from cláusulas |
Usar vários From cláusulas |
Exemplos de sintaxe de expressão consulta
Select
O exemplo a seguir utiliza o select cláusula translation from VPE for Csharp ou Select cláusula Visual Basic para o projeto a primeira letra de cada seqüência de caracteres em uma lista de seqüências de caracteres.
Dim words As New List(Of String)(New String() {"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
List<string> words = new List<string>() { "an", "apple", "a", "day" };
var query = from word in words
select word.Substring(0, 1);
foreach (string s in query)
Console.WriteLine(s);
/* This code produces the following output:
a
a
a
d
*/
SelectMany
O exemplo a seguir usa vários from as cláusulas em translation from VPE for Csharp ou From cláusulas em Visual Basic para projeto cada palavra de cada seqüência de caracteres em uma lista de seqüências de caracteres.
Dim phrases As New List(Of String)(New String() {"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
List<string> phrases = new List<string>() { "an apple a day", "the quick brown fox" };
var query = from phrase in phrases
from word in phrase.Split(' ')
select word;
foreach (string s in query)
Console.WriteLine(s);
/* This code produces the following output:
an
apple
a
day
the
quick
brown
fox
*/
selecionar versus SelectMany
O trabalho de ambos os Select() e SelectMany() é produzir um valor de resultado (ou valores) dos valores de fonte. Select() produz um valor de resultado para cada valor de fonte. O resultado geral, portanto, é um conjunto que possui o mesmo número de elementos de coleção de fonte.Em contraste, SelectMany() produz um único resultado geral que contém sub-collections concatenadas de cada valor de fonte. A função de transformação que é passada sistema autônomo um argumento para SelectMany() deve retornar uma sequência enumerável de valores para cada valor de fonte. Essas enumeráveis seqüências forem concatenadas, em seguida, por 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, suponha que a função seletor (transformação) seleciona a matriz de flores de cada valor de fonte.
Esta ilustração apresenta sistema autônomo Select() Retorna um conjunto que possui o mesmo número de elementos de coleção de fonte.
Esta ilustração apresenta como SelectMany() concatena a sequência de intermediária dos arrays em um valor do resultado final que contém cada valor de cada array intermediário.
Exemplo de código
O exemplo a seguir compara o comportamento de Select() e SelectMany(). O código cria um "Buquê" de flores colocando os dois primeiros itens de cada lista de nomes de flor na coleção de fonte.Neste exemplo, "único valor" que a função de transformaçãoSelect<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>) usos propriamente dito é uma coleção de valores. Isso requer o extra foreach (For Each em Visual Basic) loop para enumerar cada sub-sequência cada sequência de caracteres.
Class Bouquet
Public Flowers As List(Of String)
End Class
Sub SelectVsSelectMany()
Dim bouquets As New List(Of Bouquet)(New Bouquet() { _
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
class Bouquet
{
public List<string> Flowers { get; set; }
}
static void SelectVsSelectMany()
{
List<Bouquet> bouquets = new List<Bouquet>() {
new Bouquet { Flowers = new List<string> { "sunflower", "daisy", "daffodil", "larkspur" }},
new Bouquet{ Flowers = new List<string> { "tulip", "rose", "orchid" }},
new Bouquet{ Flowers = new List<string> { "gladiolis", "lily", "snapdragon", "aster", "protea" }},
new Bouquet{ Flowers = new List<string> { "larkspur", "lilac", "iris", "dahlia" }}
};
// *********** Select ***********
IEnumerable<List<string>> query1 = bouquets.Select(bq => bq.Flowers);
// ********* SelectMany *********
IEnumerable<string> query2 = bouquets.SelectMany(bq => bq.Flowers);
Console.WriteLine("Results by using Select():");
// Note the extra foreach loop here.
foreach (IEnumerable<String> collection in query1)
foreach (string item in collection)
Console.WriteLine(item);
Console.WriteLine("\nResults by using SelectMany():");
foreach (string item in query2)
Console.WriteLine(item);
/* This code produces the following output:
Results by using Select():
sunflower
daisy
daffodil
larkspur
tulip
rose
orchid
gladiolis
lily
snapdragon
aster
protea
larkspur
lilac
iris
dahlia
Results by using SelectMany():
sunflower
daisy
daffodil
larkspur
tulip
rose
orchid
gladiolis
lily
snapdragon
aster
protea
larkspur
lilac
iris
dahlia
*/
}
Mais informações sobre como projeto
Consulte também
Conceitos
Visão geral de operadores de consulta padrão
Referência
Selecionar cláusula (Referência C#)