Compartilhar via


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

Enumerable.Select

Queryable.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

Enumerable.SelectMany

Queryable.SelectMany

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#)

Cláusula Select (Visual Basic)

System.Linq