public int CompareTo(IListLine other, bool hasPrevRound) { var e = other as FlashListLine; if (e == null) { throw new ArgumentException("other"); } var n = this.Res.CompareTo(e.Res); if (n != 0) { return(n); } n = this.Climber.VK.CompareTo(other.Climber.VK); if (n != 0) { return(n); } n = this.Climber.Team.CompareTo(other.Climber.Team); if (n != 0) { return(n); } return(this.Climber.Person.FullName.CompareTo(other.Climber.Person.FullName)); }
private void SortBlock(IEnumerable <IListLine> block, ClimbingContext2 context) { var roundResults = block.Select(ln => { int routeNumber; var n = this.GetResult(ln.Climber.Iid, out routeNumber, context); return(new { Result = n, Route = routeNumber }); }) .ToList(); if (roundResults.Count(r => r.Result == null) > 0 || roundResults.Select(r => r.Route).Distinct().Count() > 1) { return; } roundResults.Sort((a, b) => a.Result.CompareTo(b.Result, this.PreviousRound != null)); var resultDict = block.ToDictionary(b => b.Climber.Iid); IListLine current = null; List <IListLine> currentBlock = this.PreviousRound == null ? null : new List <IListLine>(); int startPos = block.First().Pos; for (int i = 0; i < roundResults.Count; i++) { if (current != null && current.EqualResults(roundResults[i].Result)) { resultDict[roundResults[i].Result.Climber.Iid].Pos = resultDict[current.Climber.Iid].Pos; if (currentBlock != null) { if (currentBlock.Count < 1) { currentBlock.Add(resultDict[current.Climber.Iid]); } currentBlock.Add(resultDict[roundResults[i].Result.Climber.Iid]); } } else { if (currentBlock != null && currentBlock.Count > 1) { this.PreviousRound.SortBlock(currentBlock, context); currentBlock.Clear(); } current = roundResults[i].Result; resultDict[current.Climber.Iid].Pos = startPos + i; } } if (currentBlock != null && currentBlock.Count > 1) { this.PreviousRound.SortBlock(currentBlock, context); } }
public bool EqualResults(IListLine o) { var other = o as ListLine; if (other == null) { throw new ArgumentException("o"); } if (!(this.HasResult() && other.HasResult())) { return(false); } return(this.CompareResult(other) == 0); }
public int CompareTo(IListLine o, bool hasPrevRound) { var other = o as ListLine; if (other == null) { throw new ArgumentException("o"); } var thisRT = this.SortRT(hasPrevRound); var otherRT = other.SortRT(hasPrevRound); int n = thisRT.CompareTo(otherRT); if (n != 0) { return(n); } if (this.HasResult()) { n = this.CompareResult(other); if (n != 0) { return(n); } n = this.Climber.VK.CompareTo(other.Climber.VK); if (n != 0) { return(n); } n = this.Climber.Team.CompareTo(other.Climber.Team); if (n != 0) { return(n); } n = this.Climber.Person.FullName.CompareTo(other.Climber.Person.FullName); if (n != 0) { return(n); } } return(this.Start.CompareTo(other.Start)); }
public bool EqualResults(IListLine other) { return(this.Res == ((FlashListLine)other).Res); }
/// <summary> /// Сортировка протоколов /// </summary> /// <param name="resultList"></param> private void Sort(IEnumerable <IListLine> resultList, bool setPoints, ClimbingContext2 context) { if (resultList == null) { return; } // Только с результатами var results = resultList.ToList().Where(r => r.HasResult() && !r.PreQf).ToList(); foreach (var r in resultList.Where(r => !r.HasResult())) { r.PosText = r.PtsText = string.Empty; r.Pos = int.MaxValue; } foreach (var r in resultList.Where(r => r.PreQf)) { r.Points = r.Pos = 0; r.PtsText = r.PosText = string.Empty; } results.Sort((a, b) => a.CompareTo(b, this.PreviousRound != null)); // ищем одинаковые места IListLine current = null; List <IListLine> currentBlock = this.PreviousRound == null ? null : new List <IListLine>(); for (int i = 0; i < results.Count; i++) { if (current != null && results[i].EqualResults(current)) { results[i].Pos = current.Pos; if (currentBlock != null) { if (currentBlock.Count < 1) { currentBlock.Add(current); } currentBlock.Add(results[i]); } } else { if (currentBlock != null && currentBlock.Count > 1) { this.PreviousRound.SortBlock(currentBlock, context); currentBlock.Clear(); } current = results[i]; current.Pos = i + 1; } } if (currentBlock != null && currentBlock.Count > 1) { this.PreviousRound.SortBlock(currentBlock, context); } if (!setPoints) { return; } results.Sort((a, b) => { int n = a.Pos.CompareTo(b.Pos); if (n != 0) { return(n); } return(a.Climber.VK.CompareTo(b.Climber.VK)); }); // тут проставляем баллы и попадание в следующий тур int groupStart = -1; int vkCount = 0; int groupPos = 0; int groupCount = 0; int vkGrpCount = 0; IListLine groupResult = null; for (int i = 0; i < results.Count; i++) { // одинаковые места if (groupResult != null && results[i].Pos == groupResult.Pos) { if (results[i].Climber.VK) { results[i].PosText = results[i].PtsText = "в/к"; vkCount++; } else { groupCount++; results[i].PosText = groupPos.ToString(); } if (vkGrpCount <= 0) { results[i].Qf = groupPos <= this.Quota ? NextRoundQf.Qualified : NextRoundQf.NotQf; } } else { // если места разные // считаем баллы для участников в конкурсе if (vkGrpCount <= 0 && groupStart >= 0) { var pts = groupPos + (groupCount - 1) / 2.0; for (int k = groupStart; k < i; k++) { results[k].Points = pts; if (!results[k].Climber.VK) { results[k].PtsText = pts.ToString("0.#"); } } } // если чувак вне конкурса, ситаем общее число таких результатов if (results[i].Climber.VK) { if (vkGrpCount <= 0) { groupStart = i; } vkGrpCount++; vkCount++; } else { // считаем квоту попадания var qf = (i + 1 - vkCount) <= this.Quota ? NextRoundQf.Qualified : NextRoundQf.NotQf; // если предыдущий чувак был в/к, раком поставим ему баллы if (vkGrpCount > 0) { var ptsStep = 1.0 / (vkGrpCount + 1); var pts = (double)i - vkCount; IListLine currentVK = null; for (int k = groupStart; k < i; k++) { if (currentVK != null && currentVK.Pos == results[k].Pos) { results[k].Points = pts; } else { pts += ptsStep; currentVK = results[k]; currentVK.Points = pts; } results[k].Qf = qf; } } groupStart = i; groupCount = 1; groupPos = i + 1 - vkCount; vkGrpCount = 0; results[i].Qf = qf; results[i].PosText = groupPos.ToString(); } groupResult = results[i]; } } // для последнего места if (groupStart >= 0) { if (vkGrpCount > 0) { var qf = (results.Count + 1 - vkCount) <= this.Quota ? NextRoundQf.Qualified : NextRoundQf.NotQf; var ptsStep = 1.0 / (vkGrpCount + 1); var pts = (double)results.Count - vkCount; IListLine currentVK = null; for (int k = groupStart; k < results.Count; k++) { if (currentVK != null && currentVK.Pos == results[k].Pos) { results[k].Points = pts; } else { pts += ptsStep; currentVK = results[k]; currentVK.Points = pts; } results[k].Qf = qf; } } else { var pts = groupPos + (groupCount - 1) / 2.0; for (int k = groupStart; k < results.Count; k++) { results[k].Points = pts; if (!results[k].Climber.VK) { results[k].PtsText = pts.ToString("0.#"); } } } } if (this.PreviousRound == null) { foreach (var r in results.Where(r => r.Dns || r.Dsq)) { r.PosText = string.Empty; } } foreach (var r in results.Where(r => !r.Climber.VK && r.NilResult())) { r.PosText = (results.Count - vkCount).ToString(); } }