Esempio n. 1
0
        /// <summary>
        /// Plays a single <see cref="MatchDay"/> for every group.
        /// </summary>
        /// <exception cref="InvalidOperationException">The group stage is complete.</exception>
        public void Play()
        {
            if (_qualifiedTeams.Count == _qualifiedCount)
            {
                throw new InvalidOperationException("The group stage is complete.");
            }

            bool stillPlaying = false;

            foreach (var group in Groups)
            {
                if (group.NextMatchDay != null)
                {
                    group.Play();
                    stillPlaying = true;
                }
            }

            if (!stillPlaying)
            {
                var divideQualifiedByGroup = _qualifiedCount / Groups.Count;
                for (int i = 0; i < divideQualifiedByGroup; i++)
                {
                    _qualifiedTeams.AddRange(GetTeamsAtSpecifiedRanking(i + 1).Select(r => r.Team));
                }

                var restQualified = _qualifiedCount % Groups.Count;
                if (restQualified > 0)
                {
                    var restTeams       = GetTeamsAtSpecifiedRanking(divideQualifiedByGroup + 1);
                    var restTeamsSorted = GroupRanking.Sort(restTeams).Select(r => r.Team);
                    _qualifiedTeams.AddRange(restTeamsSorted.Take(restQualified));
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Generates the ranking of the group.
        /// </summary>
        /// <returns>A dictionnary where the key is the rank.</returns>
        public IReadOnlyDictionary <int, GroupRanking> GetRanking()
        {
            var rankings = Teams.Select(t => new GroupRanking(t, GetTeamMatches(t, played: true, excludeExempt: true))).ToList();

            rankings = GroupRanking.Sort(rankings);

            return(rankings.ToDictionary(r => rankings.IndexOf(r) + 1, r => r));
        }