如何从整数列表中计算排名

本文关键字:计算 列表 整数 | 更新日期: 2023-09-27 18:36:24

例如,在数据库(SQL Server)中,一列值如下所示:

Col1
====
10
5
15
20
5
10
2

这类似于整数数据列表。

排名应为:

Col1 Rank
==== ====
20    1
15    2
10    3
10    3
5     4
5     4
2     5

我尝试了以下方式:

1) First sort the list of data in descending order of "Col1" value
2) Find the index of a particular record using FindIndex() method.
3) Then Rank = Index + 1

但只有当数据是唯一的时,它才会起作用。当索引返回0, 1, 2, 3, 4, 5, 6时,当索引返回时,当多行中存在相同的"Col1"值时,它会失败。

当列表包含使用 C# LINQ 不区分的数据(在大多数情况下!)时,如何计算排名?

如何从整数列表中计算排名

为什么不在数据库中这样做呢?

SELECT [Col1], DENSE_RANK() OVER (ORDER BY Col1 DESC) AS [Rank]
FROM Table

但是,如果您必须在 C# 中执行此操作

var data = new List<int>();
var rankings = data.OrderByDescending(x => x)
                   .GroupBy(x => x)
                   .SelectMany((g, i) =>
                       g.Select(e => new { Col1 = e, Rank = i + 1 }))
                   .ToList();

如果要在数据库中执行此操作(通过运行查询或从 VIEW 中进行选择),则查询/视图应如下所示:

SELECT [Col1], DENSE_RANK() OVER (ORDER BY Col1 DESC) AS [Rank]
FROM OriginalTable

这比使用 C# 或任何其他必须首先检索数据然后对其进行后处理的语言要容易得多,也快得多。

在 C# 中:

var data = new List<int> { 10, 12, 7, 8, 7, 6, 3, 3, 4 };
var rankings = data.OrderByDescending(x => x).GroupBy(x => x)
                   .SelectMany((g, i) =>
                       g.Select(e => new { Col1 = e, Rank = i + 1 }))
                   .ToList();
var persons = Predictions
    .OrderByDescending(s => s.Points)
    .GroupBy(g => .Points)
    .SelectMany((g, i) => g.Select(s => new{ Rank = i + 1,s.Player,s.Points}).ToList());