public IEnumerable <MatchMadeTeam> RandomizeTeams(IEnumerable <GuardianSnapshot> guardians, int teamSize)
        {
            var numberOfTeams = guardians.Count() / teamSize;
            var guardianArray = guardians.ToArray();

            var teams = new List <MatchMadeTeam>();

            for (var i = 0; i < numberOfTeams; i++)
            {
                var team           = new MatchMadeTeam();
                var teamGuardians  = new List <GuardianSnapshot>();
                var teamElo        = 0.0;
                var teamEfficiency = 0.0;

                for (var j = i * teamSize; j < i * teamSize + teamSize; j++)
                {
                    teamGuardians.Add(guardianArray[j]);
                    teamElo        += guardianArray[j].GuardianElo;
                    teamEfficiency += guardianArray[j].GuardianEfficiency;
                }

                team.Guardians      = teamGuardians;
                team.TeamElo        = teamElo / teamSize;
                team.TeamEfficiency = teamEfficiency / teamSize;

                teams.Add(team);
            }

            return(teams);
        }
        internal IEnumerable <MatchMadeTeam> SwapTwoPlayers(IEnumerable <MatchMadeTeam> teams, int teamIndex1, int teamIndex2)
        {
            var nextConfiguration = new MatchMadeTeam[teams.Count()];
            var teamsArray        = teams.ToArray();

            for (var i = 0; i < teams.Count(); i++)
            {
                nextConfiguration[i] = new MatchMadeTeam();
                var guardianArray = teamsArray[i].Guardians.ToArray();

                var newGuardiansArray = new GuardianSnapshot[guardianArray.Length];

                for (var j = 0; j < guardianArray.Length; j++)
                {
                    newGuardiansArray[j] = guardianArray[j];
                }

                nextConfiguration[i].Guardians = newGuardiansArray;
            }

            var guardianIndex1 = _random.Next(0, nextConfiguration[teamIndex1].Guardians.Count());
            var guardianIndex2 = _random.Next(0, nextConfiguration[teamIndex2].Guardians.Count());

            var team1Guardians = nextConfiguration[teamIndex1].Guardians.ToArray();
            var team2Guardians = nextConfiguration[teamIndex2].Guardians.ToArray();

            var guardian1 = team1Guardians[guardianIndex1];

            team1Guardians[guardianIndex1] = team2Guardians[guardianIndex2];
            team2Guardians[guardianIndex2] = guardian1;

            nextConfiguration[teamIndex1].Guardians = team1Guardians;
            nextConfiguration[teamIndex2].Guardians = team2Guardians;

            foreach (var team in nextConfiguration)
            {
                var teamElo = 0.0;
                var teamEff = 0.0;

                foreach (var guardian in team.Guardians)
                {
                    teamElo += guardian.GuardianElo;
                    teamEff += guardian.GuardianEfficiency;
                }

                teamElo = teamElo / team.Guardians.Count();
                teamEff = teamEff / team.Guardians.Count();

                team.TeamEfficiency = teamEff;
                team.TeamElo        = teamElo;
            }
            return(nextConfiguration.ToList());
        }
        internal IEnumerable <MatchMadeTeam> KeepNextConfiguration(IEnumerable <MatchMadeTeam> nextTeamConfiguration)
        {
            var newTeamConfiguration = new MatchMadeTeam[nextTeamConfiguration.Count()];
            var teamsArray           = nextTeamConfiguration.ToArray();

            for (var i = 0; i < nextTeamConfiguration.Count(); i++)
            {
                newTeamConfiguration[i] = new MatchMadeTeam();
                var guardianArray = teamsArray[i].Guardians.ToArray();

                var newGuardiansArray = new GuardianSnapshot[guardianArray.Length];

                for (var j = 0; j < guardianArray.Length; j++)
                {
                    newGuardiansArray[j] = guardianArray[j];
                }

                newTeamConfiguration[i].TeamEfficiency = teamsArray[i].TeamEfficiency;
                newTeamConfiguration[i].TeamElo        = teamsArray[i].TeamElo;
                newTeamConfiguration[i].Guardians      = newGuardiansArray;
            }

            return(newTeamConfiguration);
        }