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
limitecom valor 5. - Usar
Wherecom uma lambda que capturelimite. - 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
- Criamos uma lista de inteiros de 1 a 10.
- Declaramos a variável
limitecom valor 5. - Usamos o método de extensão
Wheredo LINQ, passando uma lambdan => n > limite. A lambda captura a variávellimitedo escopo externo. - O resultado é um
IEnumerable<int>com os números 6, 7, 8, 9, 10. string.Join(", ", filtrados)converte a sequência em uma string separada por vírgula e espaço.- 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
limiteapós criar a lambda: selimitefor alterado depois, o filtro usará o novo valor, pois a captura é por referência. Exemplo:
Para evitar, use uma variável local imutável ou copie o valor.var filtrados = numeros.Where(n => n > limite); limite = 3; // agora o filtro usará 3 - Esquecer
using System.Linq;: sem ele,Wherenão está disponível. - Usar
Selectem vez deWhere:Selectprojeta, 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