public async Task AddExperienceFromMonster(List <User> users, Monster monster, string channel) { var levels = users.ToDictionary(user => user.Id, user => user.Level); var userIds = users.Select(user => user.Id).ToList(); _statsRepository.AddMonsterExperienceToUsers(userIds, monster); var expGainMessageTasks = users.Select(user => _slack.SendEphemeralMessage(string.Format(DougMessages.GainedExp, user.CalculateExperienceGainedFromMonster(monster, users.Count)), user.Id, channel)); var levelUpUsers = users.Where(user => levels.GetValueOrDefault(user.Id) < user.Level).ToList(); LevelUpUsers(levelUpUsers); var levelUpMessageTasks = levelUpUsers.Select(user => _slack.BroadcastMessage(string.Format(DougMessages.LevelUp, Mention(user), user.Level), channel)); await Task.WhenAll(levelUpMessageTasks.Concat(expGainMessageTasks)); }