private async Task <GameHistory> ComputeNewUserPoints(GameHistory gameHistory) { var users = new Dictionary <string, User>(); foreach (var(playerId, player) in gameHistory.Summary.Players) { users[playerId] = await this.Repository.GetUserById(player.WebsiteId !.Value).ConfigureAwait(false); } var match = new EloMatch(); var eloPlayers = gameHistory.Summary.Players.Aggregate(new Dictionary <string, IEloPlayer>(), (acc, kvp) => { var user = users[kvp.Key]; acc[kvp.Key] = match.AddPlayer(kvp.Value.Rank, user.Points); return(acc); }); match.ComputeElos(); foreach (var(playerId, player) in gameHistory.Summary.Players) { player.Points = eloPlayers[playerId].NewElo; player.DeltaPoints = eloPlayers[playerId].EloChange; } return(gameHistory); }