public void CalcularVelocidadeMediaDeCadaPiloto(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            StringBuilder velocidadeMediaByPiloto = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            velocidadeMediaByPiloto.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Velocidade Média")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(velocidadeMediaByPiloto);

            velocidadeMediaByPiloto.Insert(0, primeiraLinha);
            velocidadeMediaByPiloto.Append(primeiraLinha).AppendLine();

            // constroi  relatorio da velocidade Média de Cada Piloto
            pDadosVoltaPilotos.ToList().ForEach(x =>
            {
                velocidadeMediaByPiloto.AppendFormat(Culture, formatString, x.Value.Piloto.Codigo.ToString("D3"), x.Value.Piloto.NomePiloto, x.Value.VelocidadeMediaCorrida.ToString()).AppendLine();
            });

            //acrescenta no relatorio Final título seção Velcidade Média por Piloto
            RelatorioFinal.Append(Environment.NewLine).AppendLine().Append("-> [ VELOCIDADE MÉDIA POR PILOTO ]").AppendLine().AppendLine();
            //append no relatorio Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(velocidadeMediaByPiloto.ToString());
        }
        public void CalcularMelhorVoltaDeCadaPiloto(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            var melhorVoltaByPilotoRelatorio = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            melhorVoltaByPilotoRelatorio.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Melhor Volta")
            .AppendLine();

            string primeiraLinha = CriarLinhaFormatadoraColunasTabelas(melhorVoltaByPilotoRelatorio);

            melhorVoltaByPilotoRelatorio.Insert(0, primeiraLinha);
            melhorVoltaByPilotoRelatorio.Append(primeiraLinha).AppendLine();

            // constrói  relatório da melhor Volta De Cada Piloto
            pDadosVoltaPilotos.ToList().ForEach(elem =>
            {
                int codigoPiloto     = elem.Key;
                String nomePiloto    = elem.Value.Piloto.NomePiloto;
                TimeSpan melhorVolta = elem.Value.MelhorVolta;

                melhorVoltaByPilotoRelatorio.AppendFormat(Culture, formatString, codigoPiloto.ToString("D4"), nomePiloto, melhorVolta.ToString(@"hh\:mm\:ss\:fff")).AppendLine();
            });

            //acrescenta no relatório Final título como: [ MELHOR VOLTA POR PILOTO ]
            RelatorioFinal.AppendLine().AppendLine().Append("-> [ MELHOR VOLTA POR PILOTO ]").AppendLine().AppendLine();
            //append no relatório Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(melhorVoltaByPilotoRelatorio.ToString());
        }
        public void CalcularMelhorVoltaDaCorrida(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            StringBuilder melhorVoltaDaCorrida = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            melhorVoltaDaCorrida.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Tempo da Volta")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(melhorVoltaDaCorrida);

            melhorVoltaDaCorrida.Insert(0, primeiraLinha);
            melhorVoltaDaCorrida.Append(primeiraLinha).AppendLine();


            //hashmap que sera retornado. OBS é um LinkedHashMap pois ele sempre preserva a ordem de insercão
            //pilotos ordenados pelo menor tempo de volta
            var pilotosOrdenadosByMenorTempoVolta = new Dictionary <int, DadosCorridaPiloto>();

            //ordena o dicionário pelo menor tempo de volta de cada piloto
            pDadosVoltaPilotos.ToList().OrderBy(x => x.Value.MelhorVolta).ToList()
            .ForEach(x => pilotosOrdenadosByMenorTempoVolta.Add(x.Key, x.Value));

            DadosCorridaPiloto dadosMelhorPiloto = pilotosOrdenadosByMenorTempoVolta.FirstOrDefault().Value;

            int      codigoPiloto = dadosMelhorPiloto.Piloto.Codigo;
            String   nomePiloto   = dadosMelhorPiloto.Piloto.NomePiloto;
            TimeSpan melhorVolta  = dadosMelhorPiloto.MelhorVolta;

            melhorVoltaDaCorrida.AppendFormat(Culture, formatString, codigoPiloto.ToString("D3"), nomePiloto, melhorVolta.ToString(@"hh\:mm\:ss\:fff")).AppendLine();

            //acrescenta no relatorio Final título seção MELHOR VOLTA POR PILOTO
            RelatorioFinal.AppendLine().AppendLine().Append("-> [ MELHOR VOLTA DA CORRIDA ]").AppendLine().AppendLine();
            //append no relatorio Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(melhorVoltaDaCorrida.ToString());
        }
        public void CalcularClassificacaoFinalPilotos(Dictionary <int, DadosCorridaPiloto> pPosicaoFinal)
        {
            StringBuilder classificacaoFinal = new StringBuilder();

            var formatString = "|{0,-30}|{1,-30}|{2,-30}|{3,-30}|{4,-30}|{5,-30}|";

            classificacaoFinal.AppendLine()
            .AppendFormat(Culture, formatString, "Posição Chegada", "Código Piloto", "Nome Piloto", "Qtde Voltas Completadas", "Tempo Total de Prova", "Tempo de Chegada Após Vencedor")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(classificacaoFinal);

            classificacaoFinal.Insert(0, primeiraLinha);
            classificacaoFinal.Append(primeiraLinha).AppendLine();

            TimeSpan tempoChegadaVencedor = pPosicaoFinal.FirstOrDefault().Value.HoraUltimaVolta;
            int      count = 1;

            // constrói  relatorio da classificação final de cada piloto
            pPosicaoFinal.ToList().ForEach(x =>
            {
                int codigoPiloto     = x.Key;
                string nomePiloto    = x.Value.Piloto.NomePiloto;
                int qtdVoltas        = x.Value.NumeroDeVoltasTotais;
                string tempoTotal    = x.Value.TempoTotalCorrida.ToString(@"hh\:mm\:ss\:fff");
                TimeSpan horaChegada = x.Value.HoraUltimaVolta;

                string diferencaToVencedor = (tempoChegadaVencedor.CompareTo(horaChegada) == 0) ? "(Não se Aplica)" : TimeSpanUtils.OperarTimeSpans(horaChegada, tempoChegadaVencedor, ETimeSpanOperacao.Subtracao).ToString(@"hh\:mm\:ss\:fff");

                classificacaoFinal.AppendFormat(Culture, formatString, count++, codigoPiloto.ToString("D3"), nomePiloto, qtdVoltas, tempoTotal, diferencaToVencedor).AppendLine();
            });


            RelatorioFinal.Append("[ RESULTADO FINAL DA CORRIDA (CLASSIFICAÇÃO) E DIFERENÇA DE TEMPO DE CHEGADA DE CADA PILOTO PARA O VENCEDOR ]").AppendLine().AppendLine();
            RelatorioFinal.Append(classificacaoFinal.ToString());
        }