private void SortSpeedFinalsInternational(IEnumerable <ListLineSpeed> results, ClimbingContext2 context)
        {
            var climbed       = results.Where(r => r.HasResult()).ToList();
            int climbersCount = 1;

            while (climbersCount < results.Count())
            {
                climbersCount *= 2;
            }

            List <ListLineSpeed> winners = new List <ListLineSpeed>(), loosers = new List <ListLineSpeed>();

            while (climbed.Count > 0)
            {
                int n;
                var c1 = climbed.First();
                var c2 = climbed.FirstOrDefault(c => c.Start == (c1.Start % 2 == 1 ? c1.Start + 1 : (c1.Start - 1)));
                if (c2 == null)
                {
                    if (c1.Failed)
                    {
                        loosers.Add(c1);
                    }
                    else
                    {
                        winners.Add(c1);
                        c1.Pos = this.PreviousRound.GetResult(c1.ClimberId, out n, context).Pos;
                    }
                    climbed.RemoveAt(0);
                    continue;
                }
                if (c1.Failed && c2.Failed)
                {
                    loosers.Add(c1);
                    loosers.Add(c2);
                    continue;
                }

                n = c1.CompareTo(c2, true);
                if (n > 0)
                {
                    c2 = System.Threading.Interlocked.Exchange(ref c1, c2);
                }

                var c1PR = this.PreviousRound.GetResult(c1.ClimberId, out n, context);
                var c2PR = this.PreviousRound.GetResult(c2.ClimberId, out n, context);
                c1.Pos = Math.Min(c1PR.Pos, c2PR.Pos);
                winners.Add(c1);
                loosers.Add(c2);

                climbed.Remove(c1);
                climbed.Remove(c2);
            }

            winners.ForEach(r =>
            {
                r.Points  = r.Pos;
                r.PosText = r.PtsText = r.Pos.ToString();
                r.Qf      = NextRoundQf.Qualified;
            });

            this.Sort(loosers, false, context);
            loosers.Sort((a, b) => a.Pos.CompareTo(b.Pos));
            ListLineSpeed currentResult = null;
            int           currentPos    = -1;

            for (int i = 0; i < loosers.Count; i++)
            {
                if (currentResult != null && currentPos == loosers[i].Pos)
                {
                    loosers[i].Pos = currentResult.Pos;
                }
                else
                {
                    currentResult     = loosers[i];
                    currentPos        = loosers[i].Pos;
                    currentResult.Pos = winners.Count + i + 1;
                }
            }

            loosers.ForEach(r =>
            {
                r.Points  = r.Pos;
                r.PosText = r.PtsText = r.Pos.ToString();
                r.Qf      = NextRoundQf.NotQf;
            });
        }
Exemple #2
0
 public int CompareResult(ListLineSpeed other)
 {
     return(this.GetResult().CompareTo(other.GetResult()));
 }
        private void SortSpeedFinalsRussian(IEnumerable <ListLineSpeed> results, ClimbingContext2 context)
        {
            var climbed = results.Where(r => r.HasResult()).ToList();
            List <ListLineSpeed> winners = new List <ListLineSpeed>(), loosers = new List <ListLineSpeed>();
            int llCount = 0;

            while (climbed.Count > 0)
            {
                var c1 = climbed.First();
                var c2 = climbed.FirstOrDefault(c => c.Start == (c1.Start % 2 == 0 ? c1.Start - 1 : (c1.Start + 1)));
                if (c2 == null)
                {
                    if (c1.Failed)
                    {
                        llCount++;
                        loosers.Add(c1);
                    }
                    else
                    {
                        winners.Add(c1);
                    }
                    climbed.RemoveAt(0);
                    continue;
                }

                if (c1.Failed && c2.Failed)
                {
                    loosers.Add(c1);
                    loosers.Add(c2);
                    llCount++;
                }
                else
                {
                    int n = c1.CompareTo(c2, true);
                    if (n < 0)
                    {
                        winners.Add(c1);
                        loosers.Add(c2);
                    }
                    else
                    {
                        winners.Add(c2);
                        loosers.Add(c1);
                    }
                }

                climbed.Remove(c1);
                climbed.Remove(c2);
            }

            this.Sort(loosers, false, context);
            loosers.Sort((a, b) => a.Pos.CompareTo(b.Pos));

            loosers.ForEach(l => l.Qf = NextRoundQf.NotQf);
            winners.ForEach(l => l.Qf = NextRoundQf.Qualified);
            if (llCount > 0)
            {
                var luckyLoosers = loosers.Where(l => !l.Failed).Take(llCount).ToList();
                luckyLoosers.ForEach(a => a.Qf = NextRoundQf.LuckyLooser);
                winners.AddRange(luckyLoosers);
                loosers.RemoveRange(0, luckyLoosers.Count);
            }

            this.Sort(winners, false, context);
            winners.Sort((a, b) => a.Pos.CompareTo(b.Pos));

            ListLineSpeed currentRes = null;
            int           currentPos = -1;

            for (int i = 0; i < winners.Count; i++)
            {
                if (currentRes != null && currentPos == winners[i].Pos)
                {
                    winners[i].Pos = currentRes.Pos;
                }
                else
                {
                    currentRes     = winners[i];
                    currentPos     = winners[i].Pos;
                    currentRes.Pos = i + 1;
                }
            }

            currentRes = null;
            for (int i = 0; i < loosers.Count; i++)
            {
                if (currentRes != null && currentPos == loosers[i].Pos)
                {
                    loosers[i].Pos = currentRes.Pos;
                }
                else
                {
                    currentRes     = loosers[i];
                    currentPos     = loosers[i].Pos;
                    currentRes.Pos = winners.Count + 1 + i;
                }
            }

            winners.ForEach(p =>
            {
                p.Points  = p.Pos;
                p.PosText = p.PtsText = p.Pos.ToString();
            });
            loosers.ForEach(p =>
            {
                p.Points  = p.Pos;
                p.PosText = p.PtsText = p.Pos.ToString();
            });
        }