使用 linq 查找索引位置,但要考虑依赖于值的关系

本文关键字:依赖于 关系 查找 linq 索引 位置 使用 | 更新日期: 2023-09-27 17:57:07

按值排序的最佳方法是什么,找到该项目的排名索引,但要考虑关系。 第 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,

使用 linq 查找索引位置,但要考虑依赖于值的关系

请阅读我对这个问题的评论。

看一个例子:

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 中。