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

As expressões lambda 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📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. 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 lambda 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 lambda que recebe “x” 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. retorna “x 2”.

Anatomia de uma Lambda

A sintaxe geral de uma expressão lambda é:

(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 lambda 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! 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🏗️ 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. para esse método pela sua expressão lambda.

Lambdas em LINQ

As expressões lambda são amplamente usadas em LINQ para tornar a escrita de consultas🎲 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. 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 lambda que define qual filtro🎲 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. 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🎲 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 projeção:

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 lambda, 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 lambda podem rapidamente se tornar “armadilhas🧠 Memory Management Avançado: Domine Span<T> e MemoryMarshal!🧠 Memory Management Avançado: Domine Span<T> e MemoryMarshal!Transforme seu código C# usando Span<T> e MemoryMarshal para manipulação eficiente de memória, reduzindo alocações desnecessárias e elevando a performance.” 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 lambda 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🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!Descubra como usar XAML para criar interfaces atrativas em aplicações .NET. Aprenda conceitos e dicas práticas para iniciar seu projeto.”: 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