public static List<Tuple<Team, Team>> GenerateTeams(User[] Players) { var result = new ConcurrentQueue<Tuple<Team,Team>>(); var powerOfTwo = 1 << (Players.Count() - 1); var numberOfPlayers = Players.Count(); Parallel.For(0, (int)powerOfTwo, counter => { var ones = GetOnes(counter, numberOfPlayers, 0); if (ones == numberOfPlayers / 2 || (numberOfPlayers % 2 == 1 && ones == (numberOfPlayers / 2) + 1)) { result.Enqueue(CreateTeamFromInt(counter, Players)); } }); return new List<Tuple<Team,Team>>(result); }
private static Tuple<Team, Team> CreateTeamFromInt(int TeamNumber, User[] Players) { var currentPlayerMask = 1; var team1 = new Team(); var team2 = new Team(); for (int currentPlayer = 0; currentPlayer < Players.Count(); currentPlayer++) { if ((currentPlayerMask & TeamNumber) != 0) { team1.Members.Add(Players[currentPlayer]); } else { team2.Members.Add(Players[currentPlayer]); } currentPlayerMask = currentPlayerMask << 1; } return new Tuple<Team, Team>(team1, team2); }