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