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; }); }
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(); }); }