Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Minha sugestão de refatoração

Aprecio imensamente todo o conhecimento que o instrutor tem sobre a linguagem e as bibliotecas, e sua experiência na área, mas acredito que a solução ficou um tanto confusa com todos os "zigue-zagues", então vou sugerir uma outra:

// Primeiro crio um método só para a mediana, já que facilita manutenção e utilização.
// Nesse caso, o método também lida com interações com o "client"
// (Console.WriteLine()), mas o ideal seria um método para calcular
// e outro para exibir os resultados
private static void MedianaValoresVenda()
{
    Console.WriteLine("Mediana valores venda");

    using (var context = new AluraTunesEntities())
    {
        //  Direto na consulta já ordeno e seleciono o que quero
        // porque o desenvolvedor que chamar esse método
        // não deveria ter de se preocupar com outros dados
        var notasFiscais = (
            from nfs in context.NotaFiscals
            orderby nfs.Total
            select nfs.Total
        )
        // Conversão para lista a fim de facilitar manipulação
        .ToList();

        // Busco o tamanho da lista e atribuo como quantidade,
        // pois essa informação é importante para cálculo
        int qtdNotasFiscais = notasFiscais.Count();

        // Não é necessário criar uma variável para isso,
        // mas o fiz com fins de legibildade
        bool qtdPar = qtdNotasFiscais % 2 == 1;
        decimal mediana;

        if (qtdPar)
        {
            // Caso seja par, a mediana é a metaded da soma dos
            // dois valores ao centro da lista
            mediana = (notasFiscais[qtdNotasFiscais / 2] + notasFiscais[(qtdNotasFiscais / 2) + 1]) / 2;
        } else
        {
            // Caso seja ímpar, a mediana é o valor ao centro da lista
            mediana = notasFiscais[qtdNotasFiscais / 2];
        }

        // Informando ao "client" do que foi feito e o resultado
        Console.WriteLine($"Quantidade notas analisadas: {qtdNotasFiscais}");
        Console.WriteLine($"Mediana: {mediana}\n\n");
    }

    Console.ReadLine();
}

// Agora é só chamar no Main()!
// (no meu caso, escrevi o método ABAIXO do Main
// como boa prática de Código Limpo
// (método chamando métodos abaixo criando linearidade
// sequencial na leitura do código)
static void Main(string[] args)
{
    MedianaValoresVenda();
}
2 respostas

Acredito que a linha abaixo:

bool qtdPar = qtdNotasFiscais % 2 == 1;

Na realidade seja:

bool qtdPar = qtdNotasFiscais % 2 == 0;

Já que o resto da divisão por dois de um número par é zero. Atribuindo, dessa forma, verdadeiro para a variável qtdPar.

solução!

Valeu Murilo! Ótima correção!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software