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
switchexpression 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
- Definimos a classe
Pessoacom as propriedadesNomeeIdade. - Criamos uma lista com quatro pessoas de faixas etárias diferentes.
- No
foreach, usamos uma switch expression que recebepessoae testa padrões. - O primeiro caso
{ Idade: < 12 }verifica se a propriedadeIdadeé menor que 12. - O segundo caso usa
>= 12 and < 18para a faixa adolescente. - O terceiro e o quarto casos cobrem adulto e idoso.
- O padrão
_é o descarte (fallback) para qualquer valor não coberto. - 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