using System.Collections.Generic;
public class opponentsData
private double? trackPosition;
public opponentsData(double? gap, string name, string carClass, double? trackPosition, bool isPlayer)
this.carClass = carClass;
this.trackPosition = trackPosition;
this.isPlayer = isPlayer;
private double? trackPosition;
private TimeSpan bestLap;
private bool isSameClass;
private int classDifference;
public pitStop(double? gap, string name, double? trackPosition, int position, TimeSpan bestLap, bool isSameClass, int classDifference, bool isAhead)
this.trackPosition = trackPosition;
this.position = position;
this.isSameClass = isSameClass;
this.classDifference = classDifference;
public double? TrackPosition
public int ClassDifference
public static void Main()
TimeSpan sessionBestLap = TimeSpan.FromSeconds((100));
double? trackPosition = 0.600;
string myClass = "Mazda MX5";
double pitStopDuration = 10;
List<pitStop> pitStopOpponents = new List<pitStop> {};
List<opponentsData> opponents = new List<opponentsData>{};
opponents.Add(new opponentsData(-14.5, "Carlos Sainz", "Mazda MX5", 0.745, false));
opponents.Add(new opponentsData(-12.3, "Charles LeClerc", "Mazda MX5", 0.723, false));
opponents.Add(new opponentsData(-10.1, "Lando Norris", "Mazda MX5", 0.701, false));
opponents.Add(new opponentsData(-2.8, "Valtteri Bottas", "Mazda MX5", 0.628, false));
opponents.Add(new opponentsData(-2.5, "George Russel", "Mazda MX5", 0.625, false));
opponents.Add(new opponentsData(-1.8, "Nicolas Latifi", "Mazda MX5", 0.618, false));
opponents.Add(new opponentsData(-0.9, "Sebastian Vettel", "Mazda MX5", 0.609, false));
opponents.Add(new opponentsData(0.0, "Andreas Dahl", "Mazda MX5", 0.600, false));
opponents.Add(new opponentsData(+1.5, "Lance Stroll", "Mazda MX5", 0.585, false));
opponents.Add(new opponentsData(+4.5, "Mick Schumacher", "Mazda MX5", 0.555, false));
opponents.Add(new opponentsData(+5.1, "Nikita Mazepin", "Mazda MX5", 0.549, false));
opponents.Add(new opponentsData(+16.5, "Lewis Hamilton", "Mazda MX5", 0.435, false));
if (sessionBestLap.TotalSeconds > 0)
pitStopOpponents.Clear();
for (int i = 0; i < opponents.Count; i++)
if (!opponents[i].IsPlayer)
pitStopOpponents.Add(new pitStop(opponents[i].Gap, opponents[i].Name, opponents[i].TrackPosition, 0, opponents[i].BestLap, opponents[i].CarClass == myClass, 0, false));
pitStopOpponents = pitStopOpponents.OrderBy(entry => entry.Gap).ToList();
pitStopOpponents.Sort((x, y) => y.IsSameClass.CompareTo(x.IsSameClass));
for (int i = 0; i < pitStopOpponents.Count; i++)
if (pitStopOpponents[i].IsSameClass)
pitStopOpponents[i].Position = i + 1;
if (pitStopOpponents[i].IsSameClass && pitStopOpponents[i].Gap > 0)
pitStopOpponents[i].Position++;
double bestLap = pitStopOpponents[i].BestLap.TotalSeconds;
bestLap = sessionBestLap.TotalSeconds;
if ((pitStopOpponents[i].Gap*(bestLap/sessionBestLap.TotalSeconds)) - pitStopDuration < 0)
pitStopOpponents[i].IsAhead = true;
double? posOnExit = pitStopOpponents[i].TrackPosition + (pitStopDuration / bestLap);
posOnExit = posOnExit % 1;
pitStopOpponents[i].Gap = ((posOnExit - trackPosition) % 1) * sessionBestLap.TotalSeconds;
if (pitStopOpponents[i].Gap < -10 || pitStopOpponents[i].Gap > 10)
pitStopOpponents.RemoveAt(i);