
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
Um pensamento em “[C#] Filtrando dados de coleções (Where)”