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