考虑以下伪代码:
List<Person> People = new List<Person>();
int score;
...
foreach (Person p in People){
score = scoreFunc(p);
???
}
问题 - 如何按分数对Person对象列表进行排序? 如果您想知道,我不希望将得分作为Person的属性,因为在不同情况下对于同一个人将是不同的,并且在逻辑上不是Person的属性。
答案 0 :(得分:5)
使用可以比较两个人的委托/类进行排序 - 没有任何要求您需要使用单个属性来比较它们。例如
People.Sort((p1,p2)=>scoreFunc(p1)-scoreFunc(p2));
修改强>
如果您希望按分数对整个列表进行排序,那么这将是唯一的方法(您可以更改排序算法,但比较不会改变,因为分数是排序键)。现在上面可能会多次计算某些人的得分 - 所以其中一个优化可能是缓存人得分。例如,scoreFunc可以检查缓存(字典)以查看是否已经计算了分数。
可以根据您的实际要求和评分功能实施进一步优化。例如,假设您有10000人,并且您可能对前20名感兴趣。假设该人的年龄和教育资格贡献了大部分分数,而有20个其他属性做出了微小贡献。因此,您可以进行多次传球排序 - 第一次传球可以使用仅基于两个因素的分数来确定前500人,然后您应用详细得分来获得实际前20名。