private OlympicTournamentViewModel MapOlympic(OlympicTournament tournament)
        {
            var idToGameMap         = GetIdToGameMap(tournament);
            var queue               = new Queue <OlympicTournamentMatch>();
            var queueViewModel      = new Queue <OlympicTournamentMatchViewModel>();
            var tournamentViewModel = new OlympicTournamentViewModel
            {
                FinalMatch      = new OlympicTournamentMatchViewModel(idToGameMap[tournament.FinalMatch.GameId]),
                ThirdPlaceMatch = new OlympicTournamentMatchViewModel(idToGameMap[tournament.ThirdPlaceMatch.GameId])
            };

            queue.Enqueue(tournament.FinalMatch);
            queueViewModel.Enqueue(tournamentViewModel.FinalMatch);
            while (queue.Count != 0)
            {
                var current          = queue.Dequeue();
                var currentViewModel = queueViewModel.Dequeue();

                if (current.FirstPreviousStageMatch == null)
                {
                    continue;
                }

                currentViewModel.FirstPreviousStageMatch  = new OlympicTournamentMatchViewModel(idToGameMap[current.FirstPreviousStageMatch.GameId]);
                currentViewModel.SecondPreviousStageMatch = new OlympicTournamentMatchViewModel(idToGameMap[current.SecondPreviousStageMatch.GameId]);

                queue.Enqueue(current.FirstPreviousStageMatch);
                queue.Enqueue(current.SecondPreviousStageMatch);
                queueViewModel.Enqueue(currentViewModel.FirstPreviousStageMatch);
                queueViewModel.Enqueue(currentViewModel.SecondPreviousStageMatch);
            }
            return(tournamentViewModel);
        }
示例#2
0
        private OlympicTournament BuildTournament(List <List <Game> > stages, int stageIndex)
        {
            var tournament = new OlympicTournament
            {
                FinalMatch =
                    new OlympicTournamentMatch(
                        GenerateMatchOfTeams(
                            GetWinner(stages.Last()[0]),
                            GetWinner(stages.Last()[1])).GameId),
                ThirdPlaceMatch =
                    new OlympicTournamentMatch(
                        GenerateMatchOfTeams(
                            GetLooser(stages.Last()[0]),
                            GetLooser(stages.Last()[1])).GameId)
            };

            tournament.FinalMatch.FirstPreviousStageMatch  = new OlympicTournamentMatch(stages.Last()[0].GameId);
            tournament.FinalMatch.SecondPreviousStageMatch = new OlympicTournamentMatch(stages.Last()[1].GameId);
            var queue = new Queue <Tuple <OlympicTournamentMatch, string, string, int> >();

            queue.Enqueue(Tuple.Create(tournament.FinalMatch.FirstPreviousStageMatch,
                                       stages.Last()[0].TeamGameResults.ToArray()[0].Team.Name,
                                       stages.Last()[0].TeamGameResults.ToArray()[1].Team.Name,
                                       stageIndex));
            queue.Enqueue(Tuple.Create(tournament.FinalMatch.SecondPreviousStageMatch,
                                       stages.Last()[1].TeamGameResults.ToArray()[0].Team.Name,
                                       stages.Last()[1].TeamGameResults.ToArray()[1].Team.Name,
                                       stageIndex));
            while (queue.Any())
            {
                var currentMatch = queue.Dequeue();
                if (currentMatch.Item4 == 0)
                {
                    continue;
                }
                var firstPrevGame = stages[currentMatch.Item4 - 1].First(
                    g => g.TeamGameResults.Any(tgr => tgr.Team.Name == currentMatch.Item2));
                var secondPrevGame = stages[currentMatch.Item4 - 1].First(
                    g => g.TeamGameResults.Any(tgr => tgr.Team.Name == currentMatch.Item3));
                currentMatch.Item1.FirstPreviousStageMatch =
                    new OlympicTournamentMatch(firstPrevGame.GameId);
                currentMatch.Item1.SecondPreviousStageMatch =
                    new OlympicTournamentMatch(secondPrevGame.GameId);
                queue.Enqueue(Tuple.Create(currentMatch.Item1.FirstPreviousStageMatch,
                                           firstPrevGame.TeamGameResults.ToArray()[0].Team.Name,
                                           firstPrevGame.TeamGameResults.ToArray()[1].Team.Name, currentMatch.Item4 - 1));
                queue.Enqueue(Tuple.Create(currentMatch.Item1.SecondPreviousStageMatch,
                                           secondPrevGame.TeamGameResults.ToArray()[0].Team.Name,
                                           secondPrevGame.TeamGameResults.ToArray()[1].Team.Name, currentMatch.Item4 - 1));
            }

            return(tournament);
        }
        private Dictionary <int, Game> GetIdToGameMap(OlympicTournament tournament)
        {
            var ids = new List <int> {
                tournament.ThirdPlaceMatch.GameId
            };
            var queue = new Queue <OlympicTournamentMatch>();

            queue.Enqueue(tournament.FinalMatch);
            while (queue.Count != 0)
            {
                var current = queue.Dequeue();
                ids.Add(current.GameId);
                if (current.FirstPreviousStageMatch == null)
                {
                    continue;
                }
                queue.Enqueue(current.FirstPreviousStageMatch);
                queue.Enqueue(current.SecondPreviousStageMatch);
            }
            return(gamesRepository.GetByIds(ids).ToDictionary(g => g.GameId, g => g));
        }