c# - 如何按不属于对象的变量对对象列表进行排序?

标签 c# list sorting

考虑以下伪代码:

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/

相关文章:

java: List.contains() 与手动搜索的性能差异

Python 两个列表之间的多重条件

c# - 如何在 vs 代码中生成具有文件范围命名空间语法(C#10)的类?

c# - 在 asp.net mvc4 应用程序中向 HtmlHelper 添加扩展方法

list - 在python中制作一定范围内的均匀间隔数字列表

Java - 使用 Collections.sort() 进行排序

php - Piwigo - 按 Piwigo 管理员中设置的顺序对网站上的相册进行排序

python - Python 3 中的排序函数

c# - 使用多态性和 Protobuf-net 进行序列化和反序列化

c# - .NET 在运行时之前创建一个大小未知的数组(或更好的数组切片方式)