1
resposta

[Projeto] Nunca sei exatamente como é que o instrutor pensa qual será a "entrada"

Como não ficou explicito no enunciado da questão que a entrada seria "hard coded", fiz uma versão onde o input é só a sequencia de números direto no terminal, assim vcs podem testar com várias entradas facilmente no terminal e ver a resposta rapidamente, basta usar algo como:

dotnet run program.cs 5 42 8 11 23 1 14 30 19 27 36 2 50 7 18 9

dotnet run program.cs 5 8 11 23 42 1 14 30 7 27 36 2 50 19 18 9

dotnet run program.cs 7 5 8 11 23 1 14 19 30 27 36 42 2 50 18 9

Segue minha implementação:

int[] combination = new int[3];

Dictionary<int, int> inputNumbers = new Dictionary<int, int>();
for (int i = 0; i < args.Length; i++)
{
    int num = int.Parse(args[i]);
    inputNumbers.Add(i, num);
}
combination[0] = inputNumbers.FirstOrDefault(x => x.Value == 19).Key;
combination[1] = inputNumbers.FirstOrDefault(x => x.Value == 42).Key;
combination[2] = inputNumbers.FirstOrDefault(x => x.Value == 7).Key;

Console.WriteLine($"Combination: {combination[0]}, {combination[1]}, {combination[2]}");
1 resposta

Oii, Pedro! Tudo bem?

Muito legal a sua iniciativa de não se limitar ao enunciado e criar uma aplicação de console que aceita argumentos dinâmicos! Isso é muito útil no dia a dia para testar cenários diferentes sem precisar recompilar o código ("hard code").

Sobre sua dúvida da "entrada": geralmente, em exercícios de lógica introdutória, o instrutor opta por valores fixos no código apenas para que o aluno foque exclusivamente na lógica de manipulação daquele dado (no caso, aprender o método IndexOf), sem se preocupar com a complexidade de tratar entradas externas. Mas seu pensamento de "software real" está certíssimo!

Agora, queria aproveitar seu código para trazer uma reflexão sobre as coleções, já que estamos no curso de C#:

  1. Redundância do dictionary: O Array, por natureza, já é uma coleção indexada (0, 1, 2...). Quando você cria um Dictionary<int, int> onde a Chave é o índice do loop i, você está basicamente recriando a estrutura que o Array já te oferece de graça.
  2. Performance e simplicidade: O uso do FirstOrDefault funciona, mas ele percorre a coleção pra achar o valor. O método Array.IndexOf (foco da aula) faz exatamente isso, mas é otimizado pra Arrays e deixa o código mais limpo.
  3. Um detalhe perigoso: Se por acaso você passar uma sequência que não tenha o número 19, o FirstOrDefault vai retornar o valor padrão do par chave/valor (que é 0). Isso diria que o número 19 está na posição 0, o que seria um falso positivo! O Array.IndexOf retornaria -1, indicando erro.

Que tal unir o melhor dos dois mundos? A sua ideia dos args com a simplicidade dos Arrays?

Ficaria assim:

// converte os args (string) diretamente para um array de inteiros
// se quiser fazer na mão, um loop for simples preenchendo o array funciona também!
int[] numeros = Array.ConvertAll(args, int.Parse); 

// usa o método da aula para achar os índices
int pos19 = Array.IndexOf(numeros, 19);
int pos42 = Array.IndexOf(numeros, 42);
int pos7 = Array.IndexOf(numeros, 7);

// verifica se todos foram encontrados (diferente de -1) antes de mostrar
if (pos19 != -1 && pos42 != -1 && pos7 != -1)
{
    Console.WriteLine($"Combinação: {pos19}-{pos42}-{pos7}");
}
else
{
    Console.WriteLine("Algum dos números da combinação não foi encontrado na sequência!");
}

Parabéns por ir além do exercício! Continue compartilhando suas soluções.

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