TudoSobre.dev

O universo dev ao seu alcance.

TudoSobre.dev

O universo dev ao seu alcance.

[C#] Filtrando dados de coleções (Where)

Depois de aprender o que são e como funcionam as expressões lambda, vamos mostrar como manipular coleções de dados usando as operações da API de System.Linq. De início, uma das operações mais usadas em coleções: filtragem de dados.

Filtrando dados em coleções à moda antiga

Antes do System.Linq, para realizar uma filtragem de dados em uma coleção eram necessários no mínimo um loop (for, foreach, while, etc) e um if (condição), usando uma abordagem imperativa. Considere a seguinte lista de números:

var lista = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

Para filtrar somente os números pares:

var pares = new List<int>(); 
foreach(var numero in lista)
{
    if (numero % 2 == 0)
        pares.Add(numero);
}

Veja que foi necessário criar uma nova lista (pares), um loop foreach e um if interno ao loop.

Filtrando dados em coleções usando Where

Através do método Where é possível filtrar dados de coleções escrevendo muito menos código. Em outras linguagens e plataformas (Java, Javascript, Scala, Haskell, etc), esta mesma operação é conhecida como filter.
Considerando a mesma lista de números inteiros do exemplo anterior, vamos filtrar somente os números pares:

var pares = lista.Where(n => n % 2 == 0).ToList();

Veja que é muito mais simples!! O método Where recebe como argumento uma expressão lambda que recebe um número (elemento da lista) e retorna um boolean (true ou false). Cada elemento da lista é testado, e só passarão os elementos que atenderem à condição.

Filtrando caracteres em strings

Podemos utilizar a mesma técnica para filtrar caracteres em strings. Por exemplo, dada uma entrada qualquer, aceitar apenas os caracteres alfabéticos (letras):

string text = "abc def ghi 123 456 !@# &*¨";
 
var array = text.ToCharArray().Where(c => char.IsLetter(c)).ToArray();
var somenteLetras = string.Join("", array);
 
// somenteLetras: abcdefghi

Filtrando listas de objetos

Sim, também é possível filtrar coleções de objetos. Considere a classe Funcionario:

public enum Cargo { Auxiliar, Tecnico, Analista, Especialista, Gerente };
 
public class Funcionario
{
    public int Matricula { get; set; }
    public Cargo Cargo { get; set; }
    public string Nome { get; set; }
    public string Email { get; set; }
 
    public Funcionario(int matricula, Cargo cargo, string nome, string email)
    {
        Matricula = matricula;
        Cargo = cargo;
        Nome = nome;
        Email = email;
    }
}

Dada uma lista de funcionários, queremos obter apenas os especialistas:

var funcionarios = new List<Funcionario>();
funcionarios.Add(new Funcionario(123, Cargo.Tecnico, "José Silva", "jose@empresa.com"));
funcionarios.Add(new Funcionario(124, Cargo.Auxiliar, "Arnaldo Antunes", "arnaldo@empresa.com"));
funcionarios.Add(new Funcionario(125, Cargo.Analista, "João Gilberto", "joao@empresa.com"));
funcionarios.Add(new Funcionario(126, Cargo.Especialista, "Marta Rocha", "marta@empresa.com"));
funcionarios.Add(new Funcionario(127, Cargo.Tecnico, "André Alves", "andre@empresa.com"));
funcionarios.Add(new Funcionario(128, Cargo.Especialista, "Gilberto Barros", "gilberto@empresa.com"));
funcionarios.Add(new Funcionario(129, Cargo.Gerente, "Alberto Roberto", "alberto@empresa.com"));
funcionarios.Add(new Funcionario(130, Cargo.Especialista, "Fernando Fernandes", "fernando@empresa.com"));
 
var especialistas = funcionarios.Where(f => f.Cargo == Cargo.Especialista).ToList();
// especialistas:
//     Marta Rocha
//     Gilberto Barros
//     Fernando Fernandes
[C#] Filtrando dados de coleções (Where)

Um pensamento em “[C#] Filtrando dados de coleções (Where)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para o topo