Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Minha solucao

Dictionary<string, List> CarrosVendidos = new Dictionary<string, List>();
CarrosVendidos.Add("Bugatti Veyron", new List { 10, 15, 12, 8, 5 });
CarrosVendidos.Add("Koenigsegg Agera RS", new List { 2, 3, 5, 6, 7 });
CarrosVendidos.Add("Lamborghini Aventador", new List { 20, 18, 22, 24, 16 });
CarrosVendidos.Add("Pagani Huayra", new List { 4, 5, 6, 5, 4 });
CarrosVendidos.Add("Ferrari LaFerrari", new List { 7, 6, 5, 8, 10 });

void Menu() {
Console.Clear();
Console.WriteLine("Escolha um carro para calcular a média de vendas:");
mostrarOpcoes();
string nomeCarro = Console.ReadLine();
if (CarrosVendidos.ContainsKey(nomeCarro)){
int vendas = CarrosVendidos[nomeCarro].Sum();
Console.WriteLine($"O carro {nomeCarro} teve o total de {vendas}");
CalcularMedia(nomeCarro);

}
else
{
    Console.WriteLine("Carro não encontrado. Tente novamente.");
    Console.ReadKey();
    Menu();
}

}

void CalcularMedia(string nomeCarro) {
if (CarrosVendidos.ContainsKey(nomeCarro)) {
var vendas = CarrosVendidos[nomeCarro];
double media = vendas.Average();
Console.WriteLine($"A média de vendas do {nomeCarro} é carros vendidos: {media}");
Console.WriteLine("Deseja olhar outro carro? (s/n)");
string resposta = Console.ReadLine();
if (resposta == "s")
{
Menu();
}
}
}

void mostrarOpcoes()
{
Console.WriteLine("Opcões de carros disponíveis:");
foreach (var carro in CarrosVendidos.Keys)
{
Console.WriteLine($"--{carro}");
}
}
Menu();

2 respostas
solução!

Olá, Guilherme! Como vai?

Vi que você explorou o Dictionary para organizar os dados de vendas com C#, utilizou muito bem o LINQ para calcular totais e médias e ainda compreendeu a importância da recursão para permitir que o usuário consulte outro carro sempre que quiser.

Uma dica interessante para o futuro é usar o método TryGetValue em vez de checar com ContainsKey e depois acessar o valor pelo indexador, já que isso evita duas buscas no dicionário. Assim:

void Menu()
{
    Console.Clear();
    Console.WriteLine("Escolha um carro para calcular a média de vendas:");
    mostrarOpcoes();
    string nomeCarro = Console.ReadLine();

    if (CarrosVendidos.TryGetValue(nomeCarro, out List<int> vendas))
    {
        int totalVendas = vendas.Sum();
        Console.WriteLine($"O carro {nomeCarro} teve o total de {totalVendas}");
        CalcularMedia(nomeCarro);
    }
    else
    {
        Console.WriteLine("Carro não encontrado. Tente novamente.");
        Console.ReadKey();
        Menu();
    }
}

Isso faz o código ficar mais limpo e eficiente, pois busca a lista de vendas apenas uma vez.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Loops em vez de recursão: para menus que repetem indefinidamente, um while costuma evitar problemas como estouro de pilha;
  • Validação de entrada: tratar casos em que o usuário digita valores vazios ou inesperados;
  • Separação de responsabilidades: manter cada método focado em uma única tarefa, como já foi feito ao dividir Menu, CalcularMedia e mostrarOpcoes.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: você já pensou em substituir a recursão do Menu por um loop while? Isso mudaria a forma como o programa trata a repetição das consultas.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Boa tarde vou bem, vou dar uma olhada sobre a documentação que enviou, sobre a pergunta eu ja tentei sim utilizar o while mas nunca soube usa-lo muito bem mesmo com a documentação, o meu maior problema com while é que eu não consigo quebrar o looping para as opções que eu crio.
Por exemplo eu criei uma função chamada menu nela tem:
//Mostrar titulo
//Mostrar opcoes
//sair
quando eu ia fazer alguns projetos eu nao conseguia fazer a opcao de sair do while entao acabava ficando uma repeticao infinita