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