C#使用Lamda表达式计算排名

我们知道在SQL Server中可以利用Row_Number、Rank等函数进行排名,在MySQL中可以利用变量方式来实现排名,对于计算操作我倾向于放在内存中来操作,而数据库只是做简单的操作,尽管各个数据库可能提供了对应函数来进行处理,但是一旦数据量大时,可能搁置到内存中计算不失为一种好的方式。接下来我们来看看在C#中如何利用LINQ来进行排名,比如我们需要统计截止到当前时间,患者咨询的医生的人次排名(同一患者在同一天咨询同一医生多次只算一次),假设我们从数据库查询出医生姓名和患者咨询医生的次数,如下:


```csharp
public class Consult
{
    public string Name { get; set; }
    public int Times { get; set; }
    public int Rank { get; set; }
}

```csharp
var consults = new List<Consult>()
{
    new Consult() { Name = "张三", Times = 1 },
    new Consult() { Name = "李四", Times = 1 },
    new Consult() { Name = "王五", Times = 2 },
    new Consult() { Name = "赵六", Times = 3 },
    new Consult() { Name = "小明", Times = 0 },
    new Consult() { Name = "小红", Times = 0 }
};

我们得到了所有医生被咨询的次数和姓名,接下来我们通过LINQ继续对其进行操作,这里最重要需要了解的是投影(Select或SelectMany)具有索引的参数,知道有索引这个参数一切就好办了,因为次数越大说明排名越靠前,所以首先我们需要对上述集合进行倒序,然后再对倒序后的结果通过次数进行分组,分组后将导致不同次数在不同集合中(反之,同次数在相同集合中),然后通过SelectMany获取到分组后的指定集合和索引,最后对此集合进行投影就得到了最终的结果排名,代码如下:

var result = consults.OrderByDescending(d => d.Times)
    .GroupBy(d => d.Times)
    .SelectMany((g, i) => g.Select(e => new Consult()
    {
        Name = e.Name,
        Times = e.Times,
        Rank = i + 1
    })).ToList();

在这里插入图片描述
上述需注意索引从0开始,所以需要加1,同时针对相同次数排名会相同,通过此种实现排名的方式,逻辑清晰且代码精简,当然,投影中含有索引参数也还可应用于其他用途,只不过用于排名的场景还是比较多,暂且到这里,感谢您的阅读。

参考文章: https://www.cnblogs.com/CreateMyself/p/12720334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值