C#黔驴技巧之实现统计结果排名

本节是实现统计排名的一点技巧,可能有一部分童鞋在实现排名统计绕了一大圈,最后还不如两行代码就搞定,代码清晰而可读性强,接下来我们来一起来看看。

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

public class Consult
{public string Name { get; set; }public int Times { get; set; }public int Rank { get; set; }
}
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,同时针对相同次数排名会相同,通过此种实现排名的方式,逻辑清晰且代码精简,当然,投影中含有索引参数也还可应用于其他用途,只不过用于排名的场景还是比较多,暂且到这里,感谢您的阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法--二叉树实现原理

二叉树 二叉树&#xff08;binary tree&#xff09;是一棵树&#xff0c;其中每个节点都不能有多于两个的子节点二叉树的一个性质是一颗平均二叉树的深度要比节点个数N小得多&#xff08;重点&#xff09;&#xff0c;对二叉树的分析得出其平均深度为O(N\sqrt NN​)&#xff0…

[C++STL]C++实现stack容器适配器

代码如下: #include <iostream> #include <deque> using namespace std;template<typename T,typename Con deque<T>> class Stack { public:Stack() {}void Push(const T &x) {_c.push_back(x);}void Pop(){_c.pop_back();}T & Top(){retur…

Istio Pilot架构解析

本文节选自 ServiceMesher 社区联合编写的《Istio Handbook——Istio 服务网格进阶实战》。本书地址&#xff1a;https://github.com/servicemesher/istio-handbook/在应用从单体架构向微服务架构演进的过程中&#xff0c;微服务之间的服务发现、负载均衡、熔断、限流等服务治理…

数据结构与算法--二叉查找树实现原理

二叉查找树 二叉树的一个重要应用就是他在查询中的使用&#xff0c;假设书中每个节点存储一项数据。在我们的案例中&#xff0c;任意复杂的项在java中都容易处理&#xff0c;但为了简单还是假设都是整数。还假设他们都是不重复的整数&#xff0c;使二叉树称为二叉查找树的性质…

[C++STL]C++实现queue容器适配器

代码如下: #include <iostream> #include <deque>using namespace std;template<typename T,typename Con deque<T>> class Queue { public:Queue(){}void Push(const T & x){_c.push_back(x);}void Pop(){_c.pop_front();}T &Back(){return…

当模板方法遇到了委托函数,你的代码又可以精简了

现如今当你翻看一些开源项目源码的时候&#xff0c;你会发现现在到处充斥着委托函数&#xff0c;如Func,Action,Predicate&#xff0c;确实现在的C#在函数式编程 的路上越来越成为主流&#xff0c;越来越显示威力&#xff0c;曾经的一些经典设计模式写法&#xff0c;在函数式下…

数据结构与算法--面试必问AVL树原理及实现

数据结构与算法–AVL树原理及实现 AVL&#xff08;Adelson-Velskii 和landis&#xff09;树是带有平衡条件的二叉查找树&#xff0c;这个平衡条件必须容易实现&#xff0c;并且保证树的深度必须是O(logN)。因此我们让一棵AVL树中每个节点的左子树和右子树的高度最多相差1&…

C语言 实现堆

代码如下: #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h>typedef int HDataType;//堆的定义 typedef struct heap {HDataType *data;int size;int capacity; }heap;//交换 void Swap(int *a, int *b) {int temp …

MySQL8.0新特性

在这之前Mysql的版本是5.7&#xff0c;也是目前使用最广泛的一个版本。现在新版本跳过了6和7直接来到了8&#xff0c;那么V6和V7版本去哪里了呢&#xff1f;比较靠谱的说法是v6用作了内部的其他用途而v7的话是因为mysql有个产品叫做clusterdb他有7这个版本&#xff0c;所以这个…

数据结构与算法--B树原理及实现

B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中。可说总要那么海量的数据需要通过个中数据结构去存储&#xff0c;我们不可能有这么多内存区存放这些数据。那么意味着我们需要将他们放磁盘。所以这个时候范问时间复杂度O决定了他是否能适合存储磁盘…

[C++STL]C++实现priority_queue容器适配器

代码如下: #pragma once #include <iostream> #include <vector> using namespace std;template<typename T> struct Less {bool operator()(const T &a, const T &b){return a < b;} };template<typename T> struct Greater {bool operat…

为什么要用内插字符串代替string.format

知道为什么要用内插字符串&#xff0c;只有踩过坑的人才能明白&#xff0c;如果你曾今使用string.format超5个以上占位符&#xff0c;那其中的痛苦我想你肯定是能够共鸣的。一&#xff1a;痛苦经历先上一段曾今写过的一段代码&#xff0c;大家来体会一下&#xff1a;LogHelper.…

SpringCloud Alibaba 框架下公司架构图

上一篇&#xff1a;Docker容器实战思维 下一篇&#xff1a;分布式事务理论模型

C++ 实现堆

代码如下(小根堆): #include <iostream> #include <assert.h> using namespace std;//小根堆,堆排序从大到小排 class Heap { public:Heap():data(nullptr), size(0), capacity(0) {}~Heap(){delete[] data;data nullptr;size 0;capacity 0;}/*void Swap(int *…

iPhone上运行Linux也要来了

FOSSBRTES 报道称&#xff0c;用户很快将可以通过双启动功能&#xff0c;像在 Android 设备上那样在 iPhone 上运行 Linux。目前&#xff0c;iOS 越狱极客、开发人员 Raffaele 以及 mcg29 已在其 Github 页面上发布了详细说明&#xff0c;详细介绍了如何双启动 64 位 iOS 设备。…

数据结构与算法--图论,最短路算法,拓扑排序算法

图论若干定义 图&#xff08;graph&#xff09;G&#xff08;V,E&#xff09;由定点vertex的集合V&#xff0c; 和边edge的集合E组成。每一条边都是一个点对点&#xff08;v&#xff0c;w&#xff09;&#xff0c;其中 v,w 属于V集合的子集 如果点对点 是有序的&#xff0c;那…

C++泛型编程实现二叉搜索树BST

代码如下: #include <iostream> using namespace std;template <typename K,typename V> struct BNode {typedef BNode<K,V> Node;K _key;V _value;Node * _left;Node *_right;BNode(const K & key,const V & value) :_key(key),_value(value), _le…

C++泛型编程实现平衡二叉搜索树AVL

代码如下: #include <iostream> using namespace std;template <typename T> struct AVLNode {typedef AVLNode<T> Node;AVLNode(const T &val T()):_parent(nullptr),_left(nullptr),_right(nullptr),_val(nullptr),_bf(0){}Node *_parent;Node *_le…

数据结构与算法--图论最短路径算法应用-词阶求解

最短路径案例 词梯应用&#xff0c;在一个词梯中&#xff0c;每个单词均由前一个单词改变一个字母而得到。例如&#xff0c;我们通过一系列单字母替换而得到zero转换为five&#xff0c;如下&#xff1a;five&#xff1a;zero&#xff0c;hero&#xff0c;here&#xff0c;hire…

谁说.NET不适合搞大数据、机器学习和人工智能

SciSharp StackSciSharp STACK: https://scisharp.github.io/SciSharp/基于.NET的开源生态系统&#xff0c;用于数据科学、机器学习和AI。SciSharp将所有主要的ML/AI框架从Python引入.NET.特点为.NET开发者.NET开发者使用他们所了解和喜爱的工具可以最高效的工作。我们的使命是…