Разве ваша функция не эквивалентна этой:
score = timeTable.Exams.SelectMany(exam=>exam.Students)
.GroupBy(s=>s)
.Select(g=>Connections(g.Count()))
.Sum();
с вспомогательной функцией
int Connections(int corners)
{
//Formula for number of sides in a complete graph
//http://en.wikipedia.org/wiki/Complete_graph
// 0+1+2+...+(corners-1)
return corners*(corners-1)/2;
}
Это должно быть линейное время выполнения в timeTable.Exams.Sum(exam=>exam.Student.Count())
, тогда как ваше выглядит для меня квадратичным.