Exemple #1
0
            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();
            }
Exemple #2
0
 public StandingsItem FindPosition(int pos, dataorder order)
 {
     return this.FindPosition(pos, order, null);
 }