如何根据不属于对象的变量对对象列表进行排序

本文关键字:对象 列表 排序 何根 不属于 变量 | 更新日期: 2023-09-27 18:27:54

考虑以下伪代码:

List<Person> People = new List<Person>();
int score;
...
foreach (Person p in People){
score = scoreFunc(p);
???
}

问题-如何根据分数对Person对象列表进行排序?如果你想知道,我不想让分数成为Person的属性,因为在不同的情况下,同一个人的分数会不同,从逻辑上讲,它不是Person的性质。

如何根据不属于对象的变量对对象列表进行排序

排序使用一个可以比较两个人的委托/类进行,不需要使用单个属性来比较他们。例如

People.Sort((p1,p2)=>scoreFunc(p1)-scoreFunc(p2));

编辑:

如果你想按分数对整个列表进行排序,那么这将是唯一的方法(你可以更改排序算法,但比较不会改变,因为分数是排序键)。现在,上面可能会多次计算一些人的分数,因此优化之一可能是缓存个人分数。例如,scoreFunc可以在缓存(字典)中检查分数是否已经计算完毕。

可以根据您的实际需求和评分功能实现进行进一步的优化。例如,假设你有10000人,你可能对前20名感兴趣。假设一个人的年龄和学历贡献了大部分分数,而其他20个属性贡献较小。因此,你可以进行多次筛选——第一次筛选可能只基于两个因素来确定前500名,然后你应用详细的评分来获得实际的前20名。