2012-03-16 75 views
1

考虑下面的伪代码:如何用不属于对象一部分的变量对对象列表进行排序?

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

... 

foreach (Person p in People){ 

score = scoreFunc(p); 

??? 

} 

问题 - 我该如何排序的得分Person对象的名单? 如果您想知道,我不想将得分作为Person的属性,因为对于同一个人来说,在不同情况下它不同,并且在逻辑上不是Person的属性。

+0

“得分”当然可以根据需要创建一个数组或添加到集合中 – 2012-03-16 04:26:40

回答

5

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

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

编辑:

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

根据您的实际需求和计分功能的实施情况可能会发生进一步的优化。例如,假设你有10000人,你可能对前20名感兴趣。假设人的年龄和学历资格贡献了总分,而另外20个属性贡献较小。因此,您可以进行多次排序 - 第一次传球可以使用仅基于两个因素的得分来确定排名前500位的人,然后使用详细得分来获得实际排名前20位。

+0

谢谢,你认为你可以扩展一下你的答案,你会如何推荐使用这个比较对整个列表进行排序? – 2012-03-16 07:01:27

+0

@Ivan,我不是100%确定你想在这里问什么...但是,尽管如此,看看我的编辑! – VinayC 2012-03-16 08:44:47

相关问题