如何通过不属于对象的变量对对象列表进行排序?

时间:2012-03-16 04:24:35

标签: c# list sorting

考虑以下伪代码:

List<Person> People = new List<Person>();
int score;

...

foreach (Person p in People){

score = scoreFunc(p);

???

}

问题 - 如何按分数对Person对象列表进行排序? 如果您想知道,我不希望将得分作为Person的属性,因为在不同情况下对于同一个人将是不同的,并且在逻辑上不是Person的属性。

1 个答案:

答案 0 :(得分:5)

使用可以比较两个人的委托/类进行排序 - 没有任何要求您需要使用单个属性来比较它们。例如

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

修改

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

可以根据您的实际要求和评分功能实施进一步优化。例如,假设您有10000人,并且您可能对前20名感兴趣。假设该人的年龄和教育资格贡献了大部分分数,而有20个其他属性做出了微小贡献。因此,您可以进行多次传球排序 - 第一次传球可以使用仅基于两个因素的分数来确定前500人,然后您应用详细得分来获得实际前20名。