static void Main(string[] args) { string nullOrEmptyToExitApp = "_"; while (!string.IsNullOrEmpty(nullOrEmptyToExitApp)) { try { var voltas = new HashSet <Volta>(); Console.WriteLine("Cole aqui o endereço do log:"); var caminho = Console.ReadLine(); if (!File.Exists(caminho)) { throw new DirectoryNotFoundException(caminho); } foreach (var linha in File.ReadAllLines(caminho).Skip(1)) { voltas.Add(Util.ConvertToVolta(Util.SplitLog(linha))); } var results = voltas .GroupBy(c => c.piloto) .Select(r => new KeyValuePair <int, ResultadoCorrida>( r.Key.numero, new ResultadoCorrida() { posicaoChegada = null, codigoPiloto = r.Key.numero, nomePiloto = r.Key.nome, quantidadeVoltasCompletadas = r.Count(), tempoTotalProva = new TimeSpan(r.Sum(v => v.tempoVolta.Ticks)), completouCorrida = r.Max(v => v.numeroVolta) == 4, melhorVolta = new TimeSpan(r.Min(v => v.tempoVolta.Ticks)), velocidadeMediaCorrida = new TimeSpan(r.Sum(v => v.velocidadeMediaVolta.Ticks) / r.Count()), tempoChegadaAposVencedor = null } ) ).ToDictionary(i => i.Key, i => i.Value); Console.WriteLine("P - COD - Nome Piloto - V - Tempo Total - Tempo Após - Vel Média - Melhor volta"); int posicao = 1; long tempoChegadaAnterior = 0; int paddingNumeroPiloto = 3; int paddingNomePiloto = results.Values.Max(v => v.nomePiloto.Length); foreach (var result in results.Values.OrderBy(v => v.tempoTotalProva)) { if (result.completouCorrida) { result.tempoChegadaAposVencedor = new TimeSpan(tempoChegadaAnterior != 0 ? result.tempoTotalProva.Ticks - tempoChegadaAnterior : 0); tempoChegadaAnterior = result.tempoTotalProva.Ticks; result.posicaoChegada = posicao; Console.Write(result.posicaoChegada); Console.Write(" - "); Console.Write(result.codigoPiloto.ToString().PadLeft(paddingNumeroPiloto)); Console.Write(" - "); Console.Write(result.nomePiloto.PadRight(paddingNomePiloto)); Console.Write(" - "); Console.Write(result.quantidadeVoltasCompletadas); Console.Write(" - "); Console.Write(result.tempoTotalProva); Console.Write(" - "); Console.Write(result.posicaoChegada != 1 ? result.tempoChegadaAposVencedor.Value.ToString() : string.Empty.PadRight(16)); Console.Write(" - "); Console.Write(result.velocidadeMediaCorrida); Console.Write(" - "); Console.Write(result.melhorVolta); Console.WriteLine(); posicao++; } } Console.WriteLine($"Melhor volta da corrida: {results.Values.Min(v => v.melhorVolta)}"); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(); Console.WriteLine(e); } nullOrEmptyToExitApp = Console.ReadLine(); } }