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()); }