Médio C#

Filtrando com lambda e captura

Enunciado

Dada uma lista de inteiros, use uma lambda que capture uma variável limite para filtrar apenas os números maiores que esse limite. Exiba os números filtrados separados por vírgula.

Requisitos

  • Declarar uma lista de inteiros com valores de 1 a 10.
  • Definir uma variável limite com valor 5.
  • Usar Where com uma lambda que capture limite.
  • Exibir os números filtrados separados por vírgula.

Código inicial

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        var numeros = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int limite = 5;
        // TODO: filtrar e exibir
    }
}

Saída esperada

6, 7, 8, 9, 10
Ver dica

Use numeros.Where(n => n > limite) e depois string.Join(", ", resultado).

Mostrar solução
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // Lista de números de 1 a 10
        var numeros = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        
        // Variável que será capturada pela lambda
        int limite = 5;
        
        // Filtra números maiores que o limite usando lambda com captura
        var filtrados = numeros.Where(n => n > limite);
        
        // Junta os números em uma string separada por vírgula e exibe
        Console.WriteLine(string.Join(", ", filtrados));
    }
}

Passo a passo

  1. Criamos uma lista de inteiros de 1 a 10.
  2. Declaramos a variável limite com valor 5.
  3. Usamos o método de extensão Where do LINQ, passando uma lambda n => n > limite. A lambda captura a variável limite do escopo externo.
  4. O resultado é um IEnumerable<int> com os números 6, 7, 8, 9, 10.
  5. string.Join(", ", filtrados) converte a sequência em uma string separada por vírgula e espaço.
  6. Exibimos a string no console.

Por que funciona

A lambda n => n > limite é compilada como um delegate que mantém uma referência à variável limite (closure). Quando Where itera sobre a lista, a lambda avalia n > limite para cada elemento, usando o valor atual de limite. Como limite não é modificado após a criação da lambda, o filtro funciona como esperado.

Erros comuns

  • Modificar limite após criar a lambda: se limite for alterado depois, o filtro usará o novo valor, pois a captura é por referência. Exemplo:
    var filtrados = numeros.Where(n => n > limite);
    limite = 3; // agora o filtro usará 3
    
    Para evitar, use uma variável local imutável ou copie o valor.
  • Esquecer using System.Linq;: sem ele, Where não está disponível.
  • Usar Select em vez de Where: Select projeta, não filtra.

Outra forma de resolver

Poderia usar um loop foreach com if, mas a lambda com LINQ é mais declarativa e concisa.

Saída esperada

6, 7, 8, 9, 10