1
resposta

[Projeto] [Projeto] Desafio: hora da prática 5

class Pessoa
{
    public Pessoa(string nome, int idade, string email)
    {
        Nome = nome;
        Idade = idade;
        Email = email;
    }

    public string Nome { get; private set; }
    public int Idade { get; private set; }
    public string Email { get; private set; }
}

string fileName = "pessoas.json";

if (File.Exists(fileName))
{
    string jsonString = File.ReadAllText(fileName);

    var pessoas = JsonSerializer.Deserialize<List<Pessoa>>(jsonString);

    Console.Write("Digite a idade para buscar pessoas: ");
    int idadeParaBuscar = int.Parse(Console.ReadLine()!);

    var pessoasComIdade = pessoas.Where(x => x.Idade == idadeParaBuscar);

    foreach (var pessoa in pessoasComIdade)
    {
        Console.WriteLine($"Nome: {pessoa.Nome}");
        Console.WriteLine($"Idade: {pessoa.Idade}");
        Console.WriteLine($"E-mail: {pessoa.Email}");
    }
}
else
{
    Console.WriteLine($"O arquivo {fileName} não existe.");
}
1 resposta

Olá, Eduardo. Como vai?

Excelente aplicação do LINQ! Você utilizou o método de extensão .Where() com uma expressão lambda de forma muito precisa para filtrar os dados da lista. Esse é o tipo de operação que torna o C# uma linguagem extremamente poderosa para manipular coleções de dados de maneira declarativa e legível.

Assim como nos desafios anteriores, para garantir que seu código seja "à prova de falhas", vale a pena aplicar algumas validações, especialmente na entrada do usuário e no tratamento da lista filtrada. Se nenhum aluno for encontrado com a idade informada, o foreach simplesmente não executará nada, e o usuário pode ficar sem saber se o programa funcionou ou se ocorreu um erro.

Aqui estão algumas sugestões para complementar sua implementação:

  • Use o int.TryParse para evitar que o programa trave caso o usuário digite algo que não seja um número.
  • Verifique se a lista resultante do filtro contém elementos antes de exibir os dados.
  • Adicione o using System.Linq; (embora em versões recentes do .NET ele costume ser implícito, é bom conferir).

Veja como o seu código pode ser refinado:

string fileName = "pessoas.json";

if (File.Exists(fileName))
{
    string jsonString = File.ReadAllText(fileName);
    var pessoas = JsonSerializer.Deserialize<List<Pessoa>>(jsonString);

    if (pessoas != null)
    {
        Console.Write("Digite a idade para buscar pessoas: ");
        
        if (int.TryParse(Console.ReadLine(), out int idadeParaBuscar))
        {
            // Usando LINQ para filtrar
            var pessoasComIdade = pessoas.Where(x => x.Idade == idadeParaBuscar).ToList();

            if (pessoasComIdade.Any())
            {
                Console.WriteLine($"\nForam encontradas {pessoasComIdade.Count} pessoas com {idadeParaBuscar} anos:");
                foreach (var pessoa in pessoasComIdade)
                {
                    Console.WriteLine($"- {pessoa.Nome} ({pessoa.Email})");
                }
            }
            else
            {
                Console.WriteLine($"Nenhuma pessoa encontrada com a idade {idadeParaBuscar}.");
            }
        }
        else
        {
            Console.WriteLine("Por favor, digite um número de idade válido.");
        }
    }
}
else
{
    Console.WriteLine($"O arquivo {fileName} não existe.");
}
  • O método .Any() é a forma mais eficiente de verificar se o filtro retornou algum resultado.
  • Ao usar .ToList() após o .Where(), você materializa a consulta, o que é útil se precisar acessar o .Count da lista filtrada.
  • A validação do int.TryParse garante que seu programa não "exploda" caso alguém digite um texto no campo de idade.

Parabéns por chegar até aqui e dominar o uso do LINQ com arquivos JSON!

Espero que possa ter lhe ajudado!