按值排序的最佳方法是什么,找到该项目的排名索引,但要考虑关系。 第 5 位的索引可以有两个项目,因此跳过第 6 项,下一次迭代从第 7 位开始。 执行此操作的最佳方法是进行分组并跟踪索引吗?
return teamTournamentResults
.OrderByDescending(t => t.RankingPoints)
.Select((item, index) => new { Item = item, Index = index })
.Select(q => new TeamSummaryResultsModel
{
DivisionRanking = q.Index + 1,
RankingPoints= q.Item.RankingPoints,
请阅读我对这个问题的评论。
看一个例子:
List<int> mi = new List<int>(){1,2,2,5,6,7,7,7,8,9,10,10};
var qry = mi
.Select(g=>new
{
number = g,
rank = (from i in mi where i>g select i).Count()+1
});
结果:
number rank
1 12
2 10
2 10
5 9
6 8
7 5
7 5
7 5
8 4
9 3
10 1
10 1
其他有用的资源:
将 SQL Rank() 转换为 LINQ 或替代方法
具有分组和排名的 LINQ 查询
在 C# LINQ 中实现 RANK OVER SQL 子句
你需要找出所有项目的排名吗?如果您只需要单个,则不需要O(n log n)
排序。
您可以使用线性时间的简单for
循环来计算越来越小的项目,以及相等的项目列表。然后,您只需将相同的过程应用于相等项的列表,但按团队名称进行比较即可获得一致的排序。
var equalItems = new List<Team>();
int smaller = 0, bigger = 0;
var myItem = ...;
foreach(var item in teamTournametResults)
if (item.RankingPoints > myItem.RankingPoints)
++bigger;
else
{
if (item.RankingPoints < myItem.RankingPoints)
++smaller;
else if (item != myItem)
equalItems.Add(item);
}
foreach(var item in equalItems)
if (item.Name.CompareTo(myItem.Name) > 0)
++bigger;
else
++smaller;
生成的排名现在存储在 bigger
中。