Seleção de LINQ

Resumo : neste tutorial, você aprenderá como usar o Select()método LINQ para projetar cada elemento de uma sequência em um novo formato.

Introdução ao método LINQ Select

O Select()método é um método de extensão LINQ. O Select()método projeta ou transforma cada elemento de uma sequência em uma nova forma.

O seguinte mostra a sintaxe do Select()método:

IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, int, TResult> selector
)Linguagem de código:  C#  ( cs )

Nesta sintaxe:

  • TSourcerepresenta o tipo do elemento na sourcesequência.
  • TResulté o tipo de valor retornado pelo selector.
  • sourceé uma sequência de entrada com o tipo IEnumerable<TSource> .
  • selectoré uma função de transformação que se aplica a cada elemento na sourcesequência. O selectortem o tipo Func<TSource, TResult>. O segundo parâmetro com o tipo intda função de transformação é o índice do elemento na sourcesequência.

O Select()método retorna um IEnumerable<T>cujos elementos são o resultado da função de transformação em cada elemento da sourcesequência.

Se o parâmetro sourceor selectorfor nulo, o Select()método lançará um arquivo ArgumentNullException.

Como outros métodos de extensão LINQ, o Select()método é implementado usando execução adiada. Isso significa que a consulta retornada pelo Select()método não é executada até que seja enumerada por a foreachou chamando seu GetEnumerator()método.

Exemplos do método LINQ Select()

Vejamos alguns exemplos de uso do Select()método LINQ.

1) Usando o método LINQ Select() para transformar uma sequência de números inteiros

Os programas a seguir demonstram como usar o Select()método LINQ para criar uma nova sequência de números que são quadrados dos números originais:

using static System.Console;


var numbers = new[] { 1, 5, 3, 4, 7 };

var squares = numbers.Select(n => n * n);

foreach (var square in squares)
{
    WriteLine($"{square} ");
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina uma matriz de cinco números:

var numbers = new[] { 1, 5, 3, 4, 7 };Linguagem de código:  C#  ( cs )

Segundo, crie uma nova sequência de números chamada quadrados usando o Select()método:

var squares = numbers.Select(n => n * n);Linguagem de código:  C#  ( cs )

Usamos a expressão lambda n => n*ncomo a função de transformação que pega cada elemento da matriz de números, eleva-o ao quadrado e retorna os números quadrados resultantes como o elemento da nova sequência.

Terceiro, escreva cada elemento da nova sequência no console usando um foreachloop e Write()um método:

foreach (var square in squares)
{
    Write($"{square} ");
}Linguagem de código:  C#  ( cs )

Se você executar o programa, verá a seguinte saída:

1 25 9 16 49Linguagem de código:  C#  ( cs )

Observe que você pode encadear o Select()método com outros métodos de extensões como OrderBy(),, Where()etc.

Por exemplo, o programa a seguir demonstra como encadear o Select()método com o OrderBy()método para classificar a nova sequência:

using static System.Console;


var numbers = new[] { 1, 5, 3, 4, 7 };

var squares = numbers.Select(n => n * n)
                    .OrderBy(n => n);


foreach (var square in squares)
{
    Write($"{square} ");
}Linguagem de código:  C#  ( cs )

Saída:

1 9 16 25 49Linguagem de código:  C#  ( cs )

2) Usando o método LINQ Select() para transformar uma sequência de strings

O programa a seguir demonstra como usar Select()o método para colocar cada string em maiúscula em uma matriz de saudações e escrever a string modificada no console:

using static System.Console;


var greetings = new string[] { "hi","hello","hey", "howdy"};

var results = greetings.Select(
    s => s[0].ToString().ToUpper() + s.Substring(1)
);

foreach (var result in results)
{
    WriteLine(result);
}Linguagem de código:  C#  ( cs )

Primeiro, defina uma matriz de strings chamada greetingsque consiste em quatro strings.

Segundo, crie uma nova sequência de strings chamada resultsusando o Select()método. O lambda expression s => s[0].ToString().ToUpper() + s.Substring(1)pega cada elemento das saudações e coloca-o em maiúscula.

Terceiro, escreva cada elemento da resultssequência no console:

foreach (var result in results)
{
    WriteLine(result);
}Linguagem de código:  C#  ( cs )

3) Usando o método LINQ Select() para projetar sobre uma sequência de objetos

O programa a seguir ilustra como usar o Select()método para obter o nome de cada funcionário:

using static System.Console;

namespace LINQDemo
{
    class Employee
    {
        public string? Name { get; set; }
        public string? Department { get; set; }
        public int Salary { get; set; }
    }
    class Program
    {
        public static void Main()
        {
            var employees = new List<Employee>() {
                new Employee { Name = "John", Department = "HR", Salary = 50000 },
                new Employee { Name = "Jane", Department = "IT", Salary = 60000 },
                new Employee { Name = "Bob", Department = "HR", Salary = 45000 },
                new Employee { Name = "Sara", Department = "IT", Salary = 55000 },
                new Employee { Name = "Tom", Department = "IT", Salary = 65000 }
            };

            var names = employees.Select(e => e.Name);

            foreach (var name in names)
            {
                WriteLine(name);
            }
        }
    }
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina uma Employeeclasse contendo três propriedades Name,, Departmente Salary:

class Employee
{
    public string? Name { get; set; }
    public string? Department { get; set; }
    public int Salary { get; set; }
}Linguagem de código:  C#  ( cs )

Segundo, defina uma lista de funcionários:

var employees = new List<Employee>() {
    new Employee { Name = "John", Department = "HR", Salary = 50000 },
    new Employee { Name = "Jane", Department = "IT", Salary = 60000 },
    new Employee { Name = "Bob", Department = "HR", Salary = 45000 },
    new Employee { Name = "Sara", Department = "IT", Salary = 55000 },
    new Employee { Name = "Tom", Department = "IT", Salary = 65000 }
};Linguagem de código:  C#  ( cs )

Terceiro, transforme uma lista de Employeeobjetos em uma lista de nomes usando o Select()método. A expressão lambda e => e.Nameretorna o nome completo de cada Employeeobjeto:

var names = employees.Select(e => e.Name);Linguagem de código:  C#  ( cs )

Finalmente, escreva cada elemento da namessequência no console:

foreach (var name in names)
{
    WriteLine(name);
}Linguagem de código:  C#  ( cs )

Saída:

John
Jane
Bob
Sara
TomLinguagem de código:  C#  ( cs )

Além disso, você pode usar o Select()método para criar uma sequência de elementos com um novo tipo. Por exemplo:


using static System.Console;

namespace LINQDemo
{
    class Employee
    {
        public string? Name { get; set; }
        public string? Department { get; set; }
        public int Salary { get; set; }
    }
    class Program
    {
        public static void Main()
        {
            var employees = new List<Employee>() {
                new Employee { Name = "John", Department = "HR", Salary = 50000 },
                new Employee { Name = "Jane", Department = "IT", Salary = 60000 },
                new Employee { Name = "Bob", Department = "HR", Salary = 45000 },
                new Employee { Name = "Sara", Department = "IT", Salary = 55000 },
                new Employee { Name = "Tom", Department = "IT", Salary = 65000 }
            };

            var payroll = employees.Select(e => new {
                e.Name,
                e.Salary
            });

            foreach (var employee in payroll)
            {
                WriteLine(employee);
            }
        }
    }
}
Linguagem de código:  C#  ( cs )

Saída:

{ Name = John, Salary = 50000 }
{ Name = Jane, Salary = 60000 }
{ Name = Bob, Salary = 45000 }
{ Name = Sara, Salary = 55000 }
{ Name = Tom, Salary = 65000 }Linguagem de código:  C#  ( cs )

Neste exemplo, a expressão lambda retorna um objeto com um novo tipo anônimo com duas propriedades Namee Salary:

e => new {
    e.Name,
    e.Salary
}Linguagem de código:  C#  ( cs )

Resumo

  • Use o método LINQ Select()para projetar cada elemento de uma sequência em um novo formato.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *