Médio C#

Classificando pessoas com property e relational patterns

Enunciado

Dada uma lista de objetos Pessoa com Nome e Idade, use property patterns e relational patterns para classificar cada uma como "Criança" (idade < 12), "Adolescente" (12 a 17), "Adulto" (18 a 59) ou "Idoso" (60+). Imprima o nome e a classificação.

Requisitos

  • Use switch expression com property patterns ({ Idade: ... }).
  • Use relational patterns (<, >=, <=) para as faixas etárias.
  • Imprima uma linha por pessoa no formato Nome: Classificação.
  • O programa deve compilar e rodar sem erros.

Código inicial

using System;
using System.Collections.Generic;

public class Pessoa
{
    public string Nome { get; set; } = "";
    public int Idade { get; set; }
}

public class Program
{
    public static void Main()
    {
        var pessoas = new List<Pessoa>
        {
            new Pessoa { Nome = "Ana", Idade = 8 },
            new Pessoa { Nome = "Bruno", Idade = 15 },
            new Pessoa { Nome = "Carla", Idade = 30 },
            new Pessoa { Nome = "Davi", Idade = 70 }
        };

        // Seu código aqui
    }
}

Saída esperada

Ana: Criança
Bruno: Adolescente
Carla: Adulto
Davi: Idoso
Ver dica

Use pessoa switch { { Idade: < 12 } => "Criança", ... }. Lembre-se de que a ordem importa: comece pelas faixas mais restritas.

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

public class Pessoa
{
    public string Nome { get; set; } = "";
    public int Idade { get; set; }
}

public class Program
{
    public static void Main()
    {
        var pessoas = new List<Pessoa>
        {
            new Pessoa { Nome = "Ana", Idade = 8 },
            new Pessoa { Nome = "Bruno", Idade = 15 },
            new Pessoa { Nome = "Carla", Idade = 30 },
            new Pessoa { Nome = "Davi", Idade = 70 }
        };

        foreach (var pessoa in pessoas)
        {
            // Switch expression com property pattern e relational patterns
            string classificacao = pessoa switch
            {
                { Idade: < 12 } => "Criança",
                { Idade: >= 12 and < 18 } => "Adolescente",
                { Idade: >= 18 and < 60 } => "Adulto",
                { Idade: >= 60 } => "Idoso",
                _ => "Idade inválida"
            };

            Console.WriteLine($"{pessoa.Nome}: {classificacao}");
        }
    }
}

Passo a passo

  1. Definimos a classe Pessoa com as propriedades Nome e Idade.
  2. Criamos uma lista com quatro pessoas de faixas etárias diferentes.
  3. No foreach, usamos uma switch expression que recebe pessoa e testa padrões.
  4. O primeiro caso { Idade: < 12 } verifica se a propriedade Idade é menor que 12.
  5. O segundo caso usa >= 12 and < 18 para a faixa adolescente.
  6. O terceiro e o quarto casos cobrem adulto e idoso.
  7. O padrão _ é o descarte (fallback) para qualquer valor não coberto.
  8. A expressão retorna a string de classificação, que é impressa junto com o nome.

Por que funciona

Property patterns permitem testar propriedades diretamente sem acessá-las manualmente (pessoa.Idade). Relational patterns comparam valores de forma declarativa. A switch expression avalia os casos em ordem e retorna o primeiro que corresponder, o que torna a lógica clara e concisa.

Erros comuns

  • Ordem incorreta: se você colocar { Idade: >= 18 } antes de { Idade: >= 12 and < 18 }, uma pessoa de 15 anos cairia no caso adulto se a condição fosse ampla. Sempre ordene do mais restrito para o mais amplo.
  • Esquecer o caso padrão: sem _, o compilador pode alertar que nem todos os casos foram cobertos. Inclua sempre um fallback.
  • Usar = em vez de :: em property patterns, a sintaxe é { Propriedade: padrão }, não { Propriedade = padrão }.

Outra forma de resolver

Usar if/else encadeado com property patterns:

if (pessoa is { Idade: < 12 }) classificacao = "Criança";
else if (pessoa is { Idade: >= 12 and < 18 }) classificacao = "Adolescente";
// ...

Prefira a switch expression quando houver muitos casos, pois é mais legível.

Saída esperada

Ana: Criança
Bruno: Adolescente
Carla: Adulto
Davi: Idoso