public StandingsItem FindPosition(int pos, dataorder order, string classname) { int index = -1; int i = 1; IEnumerable<Sessions.SessionInfo.StandingsItem> query; switch (order) { case dataorder.fastestlap: Int32 lastpos = SharedData.Drivers.Count; if(classname == null) query = SharedData.Sessions.CurrentSession.Standings.OrderBy(s => s.FastestLap); else query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).OrderBy(s => s.FastestLap); foreach (Sessions.SessionInfo.StandingsItem si in query) { if (si.FastestLap > 0) { if (i == pos) { index = standings.FindIndex(f => f.Driver.CarIdx.Equals(si.Driver.CarIdx)); break; } i++; } } // if not found then driver has no finished laps if (index < 0) { if (classname == null) query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.FastestLap <= 0); else query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).Where(s => s.FastestLap <= 0); foreach (Sessions.SessionInfo.StandingsItem si in query) { if (i == pos) { index = standings.FindIndex(f => f.Driver.CarIdx.Equals(si.Driver.CarIdx)); break; } i++; } } break; case dataorder.previouslap: if (classname == null) query = SharedData.Sessions.CurrentSession.Standings.OrderBy(s => s.PreviousLap.LapTime); else query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).OrderBy(s => s.PreviousLap.LapTime); try { foreach (Sessions.SessionInfo.StandingsItem si in query) { if (si.PreviousLap.LapTime > 0) { if (i == pos) { index = standings.FindIndex(f => f.Driver.CarIdx.Equals(si.Driver.CarIdx)); break; } i++; } } } catch { index = -1; } // if not found then driver has no finished laps if (index < 0) { if (classname == null) query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.PreviousLap.LapTime <= 0); else query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).Where(s => s.PreviousLap.LapTime <= 0); foreach (Sessions.SessionInfo.StandingsItem si in query) { if (i == pos) { index = standings.FindIndex(f => f.Driver.CarIdx.Equals(si.Driver.CarIdx)); break; } i++; } } break; case dataorder.classposition: query = SharedData.Sessions.CurrentSession.Standings.OrderBy(s => s.Driver.CarClassOrder + s.Position).Skip(pos - 1); if (query.Count() > 0) { StandingsItem si = query.First(); return si; } else return new StandingsItem(); case dataorder.points: /* query = SharedData.Sessions.CurrentSession.Standings.OrderByDescending(s => s.Points).Skip(pos - 1); if (query.Count() > 0) { StandingsItem si = query.First(); return si; } else return new StandingsItem(); */ return new StandingsItem(); case dataorder.liveposition: if (classname == null) index = standings.FindIndex(f => f.PositionLive.Equals(pos)); else { query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).OrderBy(s => s.PositionLive).Skip(pos - 1); if (query.Count() > 0) { StandingsItem si = query.First(); return si; } else return new StandingsItem(); } break; case dataorder.trackposition: if (pos < 0) { // infront int skip = (-pos) - 1; query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.DistanceToFollowed > 0 && s.TrackSurface != StandingsItem.SurfaceType.NotInWorld).OrderBy(s => s.DistanceToFollowed); if (query.Count() <= skip) { query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.DistanceToFollowed < 0 && s.TrackSurface != StandingsItem.SurfaceType.NotInWorld).OrderBy(s => s.DistanceToFollowed).Skip((-pos) - 1 - query.Count()); } else query = query.Skip(skip); } else if (pos > 0) { // behind int skip = pos - 1; query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.DistanceToFollowed < 0 && s.TrackSurface != StandingsItem.SurfaceType.NotInWorld).OrderByDescending(s => s.DistanceToFollowed); if (query.Count() <= skip) { query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.DistanceToFollowed > 0 && s.TrackSurface != StandingsItem.SurfaceType.NotInWorld).OrderByDescending(s => s.DistanceToFollowed).Skip(pos - 1 - query.Count()); } else query = query.Skip(skip); } else // me return SharedData.Sessions.CurrentSession.followedDriver; if (query.Count() > 0) { StandingsItem si = query.First(); return si; } else return new StandingsItem(); default: if (classname == null) index = standings.FindIndex(f => f.Position.Equals(pos)); else { query = SharedData.Sessions.CurrentSession.Standings.Where(s => s.Driver.CarClassName == classname).OrderBy(s => s.Position).Skip(pos-1); if (query.Count() > 0) { StandingsItem si = query.First(); return si; } else return new StandingsItem(); } break; } if (index >= 0) return standings[index]; else return new StandingsItem(); }
public StandingsItem FindPosition(int pos, dataorder order) { return this.FindPosition(pos, order, null); }