C# - Otimizando código com métodos LINQ


Neste artigo veremos como podemos otimizar nosso código usando os métodos Select(), Where() e Count() da LINQ na linguagem C#.

Com tantos recursos disponíveis na linguagem C# às vezes esquecemos ou não usamos recursos que podem otimizar o nosso código. A LINQ oferece uma grande gama de recursos que vai agilizar o seu código e hoje vou focar apenas nos recursos:  Select(), Where() e Count().

1 - Select()

Este recurso aplica um método aos elementos de uma sequência ou coleção.

Sua utilização é uma maneira elegante de modificar os elementos de uma coleção, como um array. Esse método recebe como parâmetro uma função anônima - normalmente especificada como uma expressão lambda.

No exemplo a seguir temos o método de extensão Select aplicado a um array de strings que especifica uma expressão lambda que aplica o método ToUpper a cada elemento do array:

using System;
using System.Linq;
namespace CShp_LINQ1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] frutas = { "banana", "laranja", "manga", "abacate", "goiaba" };
            // Applica uma expressão lambada a cada elemento
            // ... O método Select altera cada elemento no resultado
            var resultado = frutas.Select(element => element.ToUpper());
            // exibe
            foreach (string fruta in resultado)
            {
                Console.WriteLine(fruta);
            }
        }
    }

Considere a quantidade de opções que você possui com Select().  É muita coisa...

Agora imagine que você tenha um array de strings usando números :

 string[] numeros = { "405", "560", "11", "17", "856" };

E você precisa converter este array de strings em um array de inteiros, e, ainda quer exibir os valores ordenados.

Deixe o Select fazer isso:

            string[] valores = { "405", "560", "11", "17", "856" };

            int[] numeros = valores.Select(id => int.Parse(id)).OrderBy(i=>i).ToArray();

            foreach (int numero in numeros)
            {
                Console.WriteLine(numero);
            }
            Console.ReadLine();

 

Veja o resultado:

Show !! não é mesmo ???

2 - Where()

Where é uma palavra-chave usada em consultas em restrições de tipo genérico. E Where() é um método que filtra elementos de uma coleção.

Vejamos um exemplo onde estamos usando Where() como um método de extensão LINQ onde vamos aplicar diferentes expressões lambdas para realizar as seguintes tarefas:

Dado um array de strings :

string[] bau = { "macoratti", "", "net", null, null, "C#", null, "", "2019" };

Temos que remover:

  1. As strings vazias;
  2. Os valores null;

Veja como é fácil e elegante realizar essa tarefa usando o método Where():

            string[] bau = { "macoratti", "", "net", null, null, "C#", null, "", "2019" };
            // remove somente os nulls
            var resultado1 = bau.Where(item => item != null);
            foreach (string item in resultado1)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("\n==========================================\n");
            // Usa método Where para remover null e strings vazias
            var resultado2 = bau.Where(item => !string.IsNullOrEmpty(item));
            foreach (string valor in resultado2)
            {
                Console.WriteLine(valor);
            }
            Console.ReadLine();

Veja o resultado final:

Acontece que Where não é apenas um método de extensão. Ele pode ser usado como uma palavra-chave contextual, where, minúscula, que faz parte de uma expressão de consulta suportada pelo LINQ.

Veja :

            int[] numeros = { 10, 20, 30, 40 , 90, 70 };

            // ... Filtra os numeros
            var resultado = from numero in numeros
                                 where numero >= 40
                                 select numero;
            foreach (int valor in resultado)
            {
                Console.WriteLine(valor);
            }
            Console.ReadLine();

Show !!!

3 - Count()

O método de extensão Count() enumera elementos. Em muitos casos, ele não é muito útil, mas em alguns cenários podemos usá-lo para realizar uma enumeração. A maioria das coleções tem uma propriedade Length ou Count que é mais eficiente.

Assim, ele sempre age em um tipo IEnumerable, e, isso significa que ele funciona em listas e arrays, mesmo quando esses tipos têm outras propriedades de contagem (Count e Lenght).

Vamos supor que temos um array de valores boleanos:

bool[] respostas = { true, false, true, true, false, true };

E precisamos contar quantos valores são true e quantos são false.

Usando Count() é simples:

            bool[] respostas = { true, false, true, true, false, true, true, false };
            var verdade = respostas.Count(resp => (resp));
            var mentira = respostas.Count(resp => (!resp));
            Console.WriteLine($"Temos {verdade} respostas true e {mentira} respostas false");  
            Console.ReadLine();

Veja o resultado:

O método Count() pode ser usado com um argumento do tipo Func. O Func pode ser especificado com uma expressão lambda.

Vejamos um exemplo onde precisamos contar apenas os elementos de um array que sejam maiores que um valor.

No exemplo temos um array de inteiros com notas e precisamos contar quantas notas são maiores ou igual a 5:

             int[] notas = { 7, 6, 5, 4, 8 , 9, 10, 3, 6, 8};

            // ... contar notas somente maiores que 5
            int aprovados = notas.Count(element => element >= 5);
            Console.WriteLine($"Total de alunos aprovados : {aprovados}" );
            Console.ReadLine();

E então ? gostou ?

Na verdade, conhecer esses recursos básicos pode fazer a diferença...

"E não temais os que matam o corpo e não podem matar a alma; temei antes aquele que pode fazer perecer no inferno a alma e o corpo."
Mateus 10:28

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti