5

例如,在数据库(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

但它只有在数据唯一的情况下才有效。当索引返回时,当多行中存在相同的“Col1”值时,它会失败0, 1, 2, 3, 4, 5, 6

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

4

4 回答 4

5

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

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();
于 2013-10-21T11:48:08.910 回答
1

在 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();
于 2013-10-21T12:25:43.030 回答
1

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

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

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

于 2013-10-21T11:52:24.697 回答
0
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());
于 2020-11-19T17:18:59.643 回答