名次排序算法代码片段(LINQ)

发布于:5/16/2019, 12:58:09 PM @孙博
技术分享 | Linq,排序,算法
许可协议:署名-非商业性使用(by-nc)

分享一个可以用来做排名的代码片段,除了可以根据数值大小做排序之外,同时实现相同数值的名次并列。

代码片段如下:

var list = new [] { 100, 200, 200, 300, 400, 500, 500, 600, 700, 100 };
list.Dump();
var rank = 1;
var prev = -1;
var preRank = 0;
var result =
    from item in list
    orderby item descending
    let current = rank++
    select new
    {
        Value = item,
        Rank = preRank = ((prev == (prev = item)) ? preRank : current)
    };
result.Dump();

执行前数组

序号 1 2 3 4 5 6 7 8 9 10
数值 100 200 200 300 400 500 500 600 700 100

执行后列表

序号 1 2 3 3 5 6 7 7 9 9
数值 700 600 500 500 400 300 200 200 100 100