C# Lambda: Simplifique seu Código com Delegates e LINQ

As expressões lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. em C# foram criadas para resolver a verbosidade que enfrentávamos ao criar métodos anônimos e lidar com delegates. Elas não só encurtam o código, mas também tornam a lógica mais direta, facilitando a leitura - principalmente quando combinadas com recursos como LINQ. Apesar de parecerem complexas no início, lambdas seguem um padrão simples e permitem escrever métodos poderosos em uma sintaxe compacta. Vamos explorar tudo isso com exemplos práticos e detalhes sobre como funcionam internamente!

Tabela de Conteúdo🔗

O que São Expressões Lambda?

Expressões lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. são funções🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. anônimas ultracompactas que você escreve no próprio lugar onde serão usadas. Elas substituem os longos métodos anônimos do C# e permitem criar blocos de código que recebem parâmetros🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código., executam instruções e retornam valores - tudo isso em uma única linha ou em poucas linhas, dependendo da complexidade.

Por exemplo, em vez de criar um método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. inteiro apenas para passar como referência em uma função, você pode escrever:

(x) => x * 2

E pronto! Isso já é uma expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. que recebe “x” e retorna “x 2”.

Anatomia de uma Lambda

A sintaxe geral de uma expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. é:

(parametros) => expressão

Ou:

(parametros) =>
{
    // bloco de instruções
    return algumValor;
}

Algumas simplificações comuns:

Sintaxe Básica e Reduções de Código

A sintaxe básica das lambdas permite reduzir a verbosidade do código. Por exemplo:

// Método tradicional
int Dobro(int x)
{
    return x * 2;
}
// Lambda equivalente
Func<int, int> dobrador = x => x * 2;
Console.WriteLine(dobrador(4)); // 8

Outros exemplos:

// 1 parâmetro, retorno implícito
Func<int, bool> ehPar = x => x % 2 == 0;
// Múltiplos parâmetros
Func<int, int, int> soma = (a, b) => a + b;
// Bloco de código (chaves e return explícito)
Action<string> logger = mensagem =>
{
    Console.WriteLine($"[LOG] {DateTime.Now}: {mensagem}");
};

Combinação com Delegates

Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! entender lambdas, é essencial lembrar de delegates - tipos que “apontam” para métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência.. Qualquer lambda precisa ser compatível com algum delegate ou expressão Func<>/Action<>. Por exemplo, se você tem um delegate:

delegate int Calculo(int a, int b);

Pode usar uma expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. para atribuir:

Calculo soma = (x, y) => x + y;

É nesse encaixe com delegates que as lambdas ganham vida. O compilador cria dinamicamente um método que atende à assinatura do delegate e substitui as referências para esse método pela sua expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros..

Lambdas em LINQ

As expressões lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. são amplamente usadas em LINQ para tornar a escrita de consultas mais fluida. Por exemplo:

var numeros = new List<int> {1, 5, 9, 10, 2};
var filtrados = numeros.Where(x => x > 5).ToList();

O .Where(x => x > 5) é uma expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. que define qual filtro aplicar em cada elemento da lista. A cada item, a expressão x > 5 é avaliada, e só entram no resultado os valores🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. onde essa condição for verdadeira.

Outro exemplo com filtro e projeçãoComo Escolher o Operador Correto em Diferentes Cenários de ConsultaComo Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente.:

var nomes = pessoas
    .Where(p => p.Cidade == "São Paulo")
    .Select(p => p.Nome.ToUpper());

Captura de Variáveis (Closures)

Lambdas podem “capturar” variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. que estejam no mesmo escopo. Suponha que você tenha:

int fator = 10;
Func<int, int> multiplicador = x => x * fator;

A variável🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. fator é “capturada” pela expressão lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros., permitindo que ela use fator mesmo após o fluxo do código sair do seu escopo🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. original. Isso é muito poderoso, mas requer cuidado para não criar comportamento inesperado se fator mudar de valor🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. em outro lugar do código.

Cuidado: Em loops, variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. capturadas podem causar problemas:

for (int i = 0; i < 5; i++)
{
    Task.Run(() => Console.WriteLine(i)); // ⚠️ Imprime 5, 5, 5...
}
// Solução: Copiar para variável local
for (int i = 0; i < 5; i++)
{
    int copia = i;
    Task.Run(() => Console.WriteLine(copia));
}

Delegates e Eventos: Lambdas como Handlers

Lambdas também são úteis para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! definir event handlers de forma rápida. Por exemplo, em WinForms:

botao.Click += (sender, args) =>
{
    MessageBox.Show("Clicou!");
};

VS Método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. Tradicional:

botao.Click += Botao_Click;
void Botao_Click(object sender, EventArgs e)
{
    MessageBox.Show("Clicou!");
}

Quando Evitar Lambdas?

Apesar de úteis, expressões lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. podem rapidamente se tornar “armadilhas” de legibilidade se forem muito grandes ou complexas. Se você se pegar escrevendo blocos enormes dentro de lambdas, talvez esteja na hora de criar um método separado. Lambdas curtas, legíveis e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. focadas são a melhor prática!

Performance: Quando (não) Usar

✅ Use lambdas para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais!:

⛔ Evite em:

Exemplo Prático: Ordenando e Filtrando Listas

Vamos supor que você tenha uma lista de objetos representando produtos🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio., cada um com Nome e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Preco. Queremos ordenar por preço e depois filtrar os produtos🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. acima de um valor específico.

public class Produto
{
    public string Nome { get; set; }
    public decimal Preco { get; set; }
}
// Exemplo de uso
var produtos = new List<Produto>
{
    new Produto { Nome = "Mouse", Preco = 50 },
    new Produto { Nome = "Teclado", Preco = 120 },
    new Produto { Nome = "Monitor", Preco = 800 },
};
// Ordenar utilizando lambda
var produtosOrdenados = produtos.OrderBy(p => p.Preco).ToList();
// Filtrar produtos acima de 100
var produtosFiltrados = produtosOrdenados.Where(p => p.Preco > 100).ToList();

Casos Reais: Refatorando Código Verboso

Antes:

public List<string> GetNomesAdmin(List<Usuario> usuarios)
{
    var admins = new List<string>();
    foreach (var user in usuarios)
    {
        if (user.IsAdmin && user.Ativo)
            admins.Add(user.Nome);
    }
    return admins;
}

Depois:

public List<string> GetNomesAdmin(List<Usuario> usuarios) =>
    usuarios
        .Where(u => u.IsAdmin && u.Ativo)
        .Select(u => u.Nome)
        .ToList();

Erros Comuns e Armadilhas

1. Modificar Variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. Capturadas:

int fator = 2;
Func<int, int> multiplicador = x => x * fator;
fator = 3; // ⚠️ A lambda captura a referência, não o valor!
Console.WriteLine(multiplicador(5)); // 15, não 10

2. Closure em Loops🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais!:

for (int i = 0; i < 5; i++)
{
    Task.Run(() => Console.WriteLine(i)); // ⚠️ Imprime 5, 5, 5...
}

3. Async⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. em Lambdas:

button.Click += async (s, e) =>
{
    await Task.Delay(1000); // ⚠️ Pode causar race conditions!
};

Desafio Prático: Transforme Loops em LINQ + Lambdas

Código Original:

List<int> numeros = new() { 1, 2, 3, 4, 5 };
List<int> quadradosPares = new();
foreach (int n in numeros)
{
    if (n % 2 == 0)
        quadradosPares.Add(n * n);
}

Solução Esperada:

var quadradosPares = numeros
    .Where(n => n % 2 == 0)
    .Select(n => n * n)
    .ToList();

👉 Dica: Use Where🔍 LINQ Básico: Filtre Dados como um Garimpeiro Digital!🔍 LINQ Básico: Filtre Dados como um Garimpeiro Digital!Descubra como o LINQ facilita o processamento de dados em C#. Filtre, ordene e transforme coleções com precisão e eficiência no seu código. para filtrar🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. e Select🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! transformar!

Conclusão

Expressões lambdaAprendendo a Criar Expressões Lambda EficientesAprendendo a Criar Expressões Lambda EficientesAprenda a criar expressões lambda eficientes em C#, otimize consultas LINQ e melhore a performance do código com dicas práticas e exemplos claros. em C# são uma ferramenta poderosa para escrever código mais limpo, direto e expressivo. Elas permitem reduzir a verbosidade de delegates ou métodos anônimos e se encaixam perfeitamente com LINQ. Mais do que isso, lambdas ajudam a tornar o código mais “declarativo”: você descreve o que quer fazer (filtrar, mapear, ordenar) em vez de como fazê-lo passo a passo. O cuidado principal é não exagerar na complexidade; use lambdas de forma enxuta, e seu código vai agradecer!

E aí, pronto para transformar funções🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. de uma página inteira em uma só linha? Vai com tudo!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados