public static Corrida Create(int numeroVoltas, IList <LinhaLog> linhasLog)
        {
            var corrida = new Corrida(numeroVoltas);

            foreach (var linha in linhasLog)
            {
                var horaFinalVolta  = TimeSpan.Parse(linha.Hora);
                var codigoPiloto    = int.Parse(linha.CodigoPiloto);
                var nomePiloto      = linha.NomePiloto;
                var numeroVolta     = int.Parse(linha.NumeroVolta);
                var velocidadeMedia = double.Parse(linha.VelocidadeMedia);

                if (!TimeSpan.TryParseExact(linha.TempoVolta, @"m\:ss\.fff", CultureInfo.InvariantCulture, out TimeSpan tempoVolta))
                {
                    if (!TimeSpan.TryParseExact(linha.TempoVolta, @"mm\:ss\.fff", CultureInfo.InvariantCulture, out tempoVolta))
                    {
                        if (!TimeSpan.TryParseExact(linha.TempoVolta, @"h\:mm\:ss\.fff", CultureInfo.InvariantCulture, out tempoVolta))
                        {
                            throw new Exception("Uma volta maior que 9 horas não é possível");
                        }
                    }
                }

                if (!corrida.Pilotos.TryGetValue(codigoPiloto, out Piloto piloto))
                {
                    piloto = new Piloto(codigoPiloto, nomePiloto);
                    corrida.Pilotos.Add(codigoPiloto, piloto);
                }

                piloto.Voltas.Add(new Volta(numeroVolta, horaFinalVolta, tempoVolta, velocidadeMedia));
            }

            return(corrida);
        }
        public static void GerarResultado(Corrida corrida, string file)
        {
            using (var sr = new StreamWriter(file))
            {
                var posicaoChegadaHeader = "Posição Chegada    ";
                var codigoPilotoHeader   = "Código Piloto    ";
                var nomePilotoHeader     = "Nome Piloto      ";
                var qtdVoltasHeader      = "Qtde Voltas Completadas    ";
                var tempoTotalHeader     = "Tempo Total de Prova";

                sr.WriteLine(string.Concat(posicaoChegadaHeader, codigoPilotoHeader, nomePilotoHeader, qtdVoltasHeader, tempoTotalHeader));

                foreach (var piloto in corrida.Pilotos)
                {
                    string linha = string.Empty;

                    var posicao = corrida.VerificarPosicaoPiloto(piloto.Value).ToString();
                    linha += posicao + new string(' ', posicaoChegadaHeader.Length - posicao.Length);

                    linha += piloto.Value.Codigo.ToString("000") + new string(' ', codigoPilotoHeader.Length - piloto.Value.Codigo.ToString("000").Length);
                    linha += piloto.Value.Nome + new string(' ', nomePilotoHeader.Length - piloto.Value.Nome.Length);
                    linha += piloto.Value.Voltas.Count + new string(' ', qtdVoltasHeader.Length - piloto.Value.Voltas.Count.ToString().Length);

                    var tempoTotal = piloto.Value.CalcularTempoTotalProva().ToString();
                    linha += tempoTotal + new string(' ', tempoTotalHeader.Length - tempoTotal.Length);

                    sr.WriteLine(linha);
                }
            }
        }