public List <DisplayTeam> FairTeams(IEnumerable <Guid> selectedPlayers) { random = new Random(); var selectedPlayersList = selectedPlayers.ToList(); var shuffled = selectedPlayers; if (selectedPlayers.Count() < 4) { return(new List <DisplayTeam>()); } if (selectedPlayers.Count() > 4) { shuffled = Shuffle(selectedPlayers); } var matchup = new List <DisplayTeam>(); var minDifference = 10000; var minPerm = Enumerable.Empty <Guid>(); foreach (var perm in permute4(shuffled)) { var blueTeam = teams.FirstOrDefault(t => (t.DefenseID == perm[0]) && (t.OffenseID == perm[1])); var redTeam = teams.FirstOrDefault(t => (t.DefenseID == perm[2]) && (t.OffenseID == perm[3])); if ((blueTeam == null)) { blueTeam = new DisplayTeam { DefenseName = playerRetriever.GuidToName(perm[0]), OffenseName = playerRetriever.GuidToName(perm[1]), Rank = ELO.EloHandler.StartingScore }; } if ((redTeam == null)) { redTeam = new DisplayTeam { DefenseName = playerRetriever.GuidToName(perm[2]), OffenseName = playerRetriever.GuidToName(perm[3]), Rank = ELO.EloHandler.StartingScore }; } var difference = Math.Abs(blueTeam.Rank + 100 - redTeam.Rank); //Blue Team with blue advantage minus redd rank if (difference < minDifference) { minDifference = difference; matchup = new List <DisplayTeam> { blueTeam, redTeam }; minPerm = perm; } } if (minDifference == 10000) { return(new List <DisplayTeam>()); } foreach (var id in minPerm) { selectedPlayersList.Remove(id); } foreach (var id in selectedPlayersList) { matchup.Add(new DisplayTeam { DefenseName = playerRetriever.GuidToName(id) }); } return(matchup); }