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