public List <Espelho> ObterMelhoresEspelhos(string[] alunos, List <string[]> historicoDeEspelhos, Func <string[], bool> filtroCasosEspeciais) { var historico = new Historico(alunos, historicoDeEspelhos); var espelhosEmbaralhados = GeraEspelhosRandomicamenteEmbaralhados(alunos, QuantidadeEmbaralhamentos); var espelhosQueAtendemFiltro = EliminaEspelhosQueNaoAtendemCasosEspeciais(espelhosEmbaralhados, filtroCasosEspeciais); var espelhosOrdenadosPorMelhorScore = OrdenarEspelhosPorScoreDeRepeticao(historico, espelhosQueAtendemFiltro); return(espelhosOrdenadosPorMelhorScore); }
/// <summary> /// Esse é o método que ordena quais são os melhores espelhos. /// O score é calculado com base nas repetições dos mesmos colegas. Quanto menos repetições, /// melhor o score. /// </summary> /// <param name="historico"></param> /// <param name="arraysEmbaralhados"></param> /// <returns></returns> private List <Espelho> OrdenarEspelhosPorScoreDeRepeticao(Historico historico, List <string[]> arraysEmbaralhados) { List <Espelho> espelhos = new List <Espelho>(); foreach (var arrayEmbaralhado in arraysEmbaralhados) { var projecao = historico.ObterHistoricoProjetadoComNovoEmbaralhamento(arrayEmbaralhado); var score = new Espelho(projecao, arrayEmbaralhado); espelhos.Add(score); } var espelhosOrdenadosPorScore = espelhos.OrderBy(x => x.ValorScore); return(espelhosOrdenadosPorScore.ToList()); }