C#的GroupBy方法是如何工作的
前言:先贴结果

GroupBy方法是如何工作的?
一、准备6个待分组的学生对象
class student
{
public string name;//姓名
public int grade;//年级 public student(string name, int grade)
{
this.name = name;
this.grade = grade;
}
}
List<student> students = new List<student>();
for (int i = 0; i < 3; i++)
{
students.Add(new student("学生" + i, 1));
}
for (int i = 0; i < 3; i++)
{
students.Add(new student("学生" + (i+3), 2));
}
其中有3个1年级,3个2年级
二、准备分组比较值产生器
static int getGrade(student stu)
{
Console.WriteLine("分组关键字->\t该学生的年级:" + stu.grade);
return stu.grade;
}
分组方法将会调用此方法,得到分组依据
三、准备分组比较器
//学生年级相等比较器,如果分组关键字使用了学生对象,那么这里就可以用学生的其他属性进行相等比较,比如学生ID
class studentComparer : IEqualityComparer<int>
{
//判断关键字是否相等,当然也可以是大于,平方,等任意规则
public bool Equals(int x, int y)
{
if (x==y)
{ Console.WriteLine("比较器->\t学生年级相等:" + x + "年级");
return true;
}
else
{
Console.WriteLine("学生年级不相等");
return false;
}
} public int GetHashCode(int x)
{
int code = x.GetHashCode();
return code.GetHashCode();
}
}
分组比较器将会对分组关键字进行比较,得到分组
四、GroupBy()分组器
//给GroupBy传入分组方法,ToList()执行分组时,程序对元素集中的每个元素调用"相等比较器"进行分组
//得到一个包含几个分组对象IGrouping的枚举对象IEnumerable
//每个分组对象IGrouping的属性是:(分组键值,分组元素集)
//因此GroupBy方法属于js中的高级方法,就像map,reduce等
//可以自定义"相等比较器"IEqualityComparer,自定义相等判断规则
IEnumerable<IGrouping<int,student>> d = students.GroupBy<student, int>(getGrade,new studentComparer()).ToList();
分组器将会采用一个尽可能减少比较次数的算法,使用比较器对分组关键字比较
在这个例子中,6个学生分两组只进行了4次比较,第一直觉是应该会用5次比较
五、分组结果展示
foreach (IGrouping<int,student> item in d)
{
Console.WriteLine(item.Key+"年级:");
foreach (student stu in item)
{
Console.WriteLine("\t名字:" + stu.name);
} }
Console.WriteLine("系统的比较方法很厉害,只用4次比较,将6个元素分成了2组,采用2分法的方式似乎可以");
Console.ReadLine();

六、完整代码
class Program
{
static void Main(string[] args)
{
//6个学生
List<student> students = new List<student>();
for (int i = 0; i < 3; i++)
{
students.Add(new student("学生" + i, 1));
}
for (int i = 0; i < 3; i++)
{
students.Add(new student("学生" + (i+3), 2));
}
//var d = students.GroupBy<student,int>(t => t.grade);//对studentList按照ClassCode分组 //给GroupBy传入分组方法,ToList()执行分组时,程序对元素集中的每个元素调用"相等比较器"进行分组
//得到一个包含几个分组对象IGrouping的枚举对象IEnumerable
//每个分组对象IGrouping的属性是:(分组键值,分组元素集)
//因此GroupBy方法属于js中的高级方法,就像map,reduce等
//可以自定义"相等比较器"IEqualityComparer,自定义相等判断规则
IEnumerable<IGrouping<int,student>> d = students.GroupBy<student, int>(getGrade,new studentComparer()).ToList();
foreach (IGrouping<int,student> item in d)
{
Console.WriteLine(item.Key+"年级:");
foreach (student stu in item)
{
Console.WriteLine("\t名字:" + stu.name);
} }
Console.WriteLine("系统的比较方法很厉害,只用4次比较,将6个元素分成了2组,采用2分法的方式似乎可以");
Console.ReadLine();
} static int getGrade(student stu)
{
Console.WriteLine("分组关键字->\t该学生的年级:" + stu.grade);
return stu.grade;
}
} class student
{
public string name;//姓名
public int grade;//年级 public student(string name, int grade)
{
this.name = name;
this.grade = grade;
}
} //学生年级相等比较器,如果分组关键字使用了学生对象,那么这里就可以用学生的其他属性进行相等比较,比如学生ID
class studentComparer : IEqualityComparer<int>
{ public bool Equals(int x, int y)
{
if (x==y)
{ Console.WriteLine("比较器->\t学生年级相等:" + x + "年级");
return true;
}
else
{
Console.WriteLine("学生年级不相等");
return false;
}
} public int GetHashCode(int x)
{
int code = x.GetHashCode();
return code.GetHashCode();
}
}
C#的GroupBy方法是如何工作的的更多相关文章
- 转载Linq中GroupBy方法的使用总结
Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class St ...
- C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法
分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...
- 登录页面和FORM的职责不对称,处理方法,刷新工作流程
登录页面和FORM的职责不对称,处理方法,刷新工作流程:
- C#DataTable 使用GroupBy方法的lamda 表达式和Linq语句写法
https://www.cnblogs.com/johnblogs/p/6006867.html DataTable ds = new DataTable(); //1.lamda 表达式写法(推荐) ...
- Linq中GroupBy方法的使用总结(转)
Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class St ...
- Linq中GroupBy方法的使用总结(转载)
from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...
- pandas.DataFrame的groupby()方法的基本使用
pandas.DataFrame的groupby()方法是一个特别常用和有用的方法.让我们快速掌握groupby()方法的基础使用,从此数据分析又多一法宝. 首先导入package: import p ...
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...
- [转]Linq中GroupBy方法的使用总结
Demo模型类: public class StudentScore { public int ID { set; get; } public string Name { set; get; } pu ...
- 理解Struts2的Action中的setter方法是怎么工作的
接触过webwork和Struts2的同行都应该知道, 提交表单的时候,只要Action中的属性有setter 方法,这些表单数据就可以正确赋值到Action中属性里:另外对于Spring配置文件中声 ...
随机推荐
- OpenHarmony Meetup 深圳站招募令
OpenHarmony Meetup城市巡回深圳站火热来袭!! 日期:2023年10月15日14:00 地点:深圳市福田区上步路中路1003号 深圳市科学馆 与OpenHarmony技术大咖近距离 ...
- Ohos-MPChart——支持多种图表绘制的组件
简介 Ohos-MPChart是OpenAtom OpenHarmony(简称"OpenHarmony")系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视 ...
- C# 属性概述
属性概述 属性允许类公开获取和设置值的公共方法,而隐藏实现或验证代码. get 属性访问器用于返回属性值,而 set 属性访问器用于分配新值. 这些访问器可以具有不同的访问级别. 有关详细信息,请参阅 ...
- Data Technology时代,如何成为一名优秀的电商数据分析师?
又是一年春招季,你最近有为找工作或换工作而犯愁吗?现在已经进入春招的"金三银四"决赛圈了,再不好好准备真的是黄花菜都要凉了.那么如何才能在"岗少人多".&quo ...
- VMware Workstation之虚拟机NAT模式
[摘要] 三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网. 一.虚拟机配置为NAT,实现访问互联网和宿主机 1.虚拟网络编辑器配置 VMnat8为NAT的虚拟网卡,NAT模式可以基于D ...
- CF-938(C-E)
CF-938 C 没啥好分析的,就记录一下我因为没有清空s[n+1].上取整写成了下取整卡了一个多小时(╬▔皿▔)╯ const int N=2e5+5; int a[N],p[N],s[N]; vo ...
- HarmonyOS NEXT应用开发—自定义视图实现Tab效果
介绍 本示例介绍使用Text.List等组件,添加点击事件onclick,动画,animationTo实现自定义Tab效果. 效果预览图 使用说明 点击页签进行切换,选中态页签字体放大加粗,颜色由灰变 ...
- 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美
简介: 台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然失色:第二个十年,我终于'宝光现形',不再去抢风头,反而与身边的 ...
- IoT Studio可视化搭建平台编辑历史功能的思考与探索
简介: 在前端可视化搭建领域中"重做"和"撤销"这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了" ...
- AI让边缘更智能 边缘让AI无处不在
简介: 城市管理和城市服务逐步走向智能化,智慧化.到2019底,全国100%的副省级城市,95%以上的地级市,以及50%以上的县级市均提出建设新型智慧城市,并已经有32个主要城市成立了专门的大数据管 ...