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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
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();
            }
        }