private List <RaceLap> GetLapsByLapNumber(int lapNumber, bool searchDownForPreviousLapsForEveryDriver) { List <RaceLap> ret = new List <RaceLap>(); ret = Laps.Get(lapNumber); if (searchDownForPreviousLapsForEveryDriver) { List <Driver> drivers = Laps.GetDrivers().ToList(); foreach (var lap in ret) { if (drivers.Contains(lap.Driver)) { drivers.Remove(lap.Driver); } } int lastDriversCount = drivers.Count; while (drivers.Count > 0) { Driver driver = drivers[0]; for (int i = lapNumber - 1; i > 0; i--) { RaceLap lap = Laps.Get(i, driver); if (lap != null) { ret.Add(lap); drivers.Remove(driver); break; } } if (lastDriversCount == drivers.Count) { throw new Exception("Cannot get last previous lap of driver " + driver.NameSurname + ". Invalid data."); } else { lastDriversCount = drivers.Count; } } } return(ret); }
private void EvaluateLaps(out RaceLap zeroLapOfPolePosition) { Minner <RaceLap> m = new Minner <RaceLap>( (RaceLap l) => l.CrossedAtTime ); RaceLap lapZero; var drivers = Laps.GetDrivers(); foreach (var driver in drivers) { RecalculateLapTimesOfDriver(driver, out lapZero); m.Add(lapZero as RaceLap); Laps.Remove(0, driver); RefreshLinksOfDriver(driver); } zeroLapOfPolePosition = m.MinimumItem; }
public void RecalculateLapTimes() { var drivers = Laps.GetDrivers(); // order laps of all drivers by time foreach (var driver in drivers) { var laps = Laps[driver]; laps.Sort(new Lap.ByCrossedAtTimeComparer()); for (int i = 1; i < laps.Count; i++) { Time bef = laps[i - 1].CrossedAtTime; Time curr = laps[i].CrossedAtTime; Time diff = curr - bef; laps[i].Time = diff; laps[i].LapNumber = i; } Laps.Remove(0, driver); } }
public void RefreshLinks() { var drivers = Laps.GetDrivers(); NonRacePositionCollection bestLaps = new NonRacePositionCollection(); // order laps of all drivers by time foreach (var driver in drivers) { var laps = Laps[driver]; LapProvider.ReLinkByCrossedAt(laps); LapProvider.ReLinkByTime(laps); laps.Sort(new Lap.ByLapTimeComparer()); if (laps.Count > 0) { bestLaps.Add(laps[0]); } } // get positions bestLaps.Sort(new Lap.ByLapTimeComparer()); Positions = bestLaps; }
public void RegisterPitLaps() { this.PitLaps.Clear(); var drivers = Laps.GetDrivers(); foreach (var driver in drivers) { var laps = Laps[driver]; laps.ForEach(i => i.PitState = RaceLap.ePitState.None); laps.Sort(new Lap.ByCrossedAtTimeComparer()); for (int i = 1; i < laps.Count - 1; i++) { if (laps[i].IsPitted == false) { continue; } RaceLap current = laps[i]; RaceLap next = laps[i + 1]; this.PitLaps.Add(current, next); if (current.PitState == RaceLap.ePitState.Exit) { current.PitState = RaceLap.ePitState.ExitAndEntry; } else { current.PitState = RaceLap.ePitState.Entry; } next.PitState = RaceLap.ePitState.Exit; } } }