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携千行百业创新成果亮相HDC.Together 2023
8月4日-6日,华为开发者大会2023(以下简称"大会")在中国松山湖举办,OpenAtom OpenHarmony(简称"OpenHarmony")隆重参会 ...
- Ohos-MPChart——支持多种图表绘制的组件
简介 Ohos-MPChart是OpenAtom OpenHarmony(简称"OpenHarmony")系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视 ...
- 【FAQ】运动健康服务云侧数据常见问题及解答
目录 Q1:v2接口相比于v1接口传参及返回的数据格式有变化吗?是否可以直接将v1接口改成v2接口? Q2:如何获取采集健康数据的穿戴设备信息? Q3:如何处理非华为手机产生的步数调用采样明细接口查询 ...
- selenium 关闭浏览--- close 与 quit 的区别
selenium 关闭浏览器,有两种方式 close quit 既然都是关闭浏览器,为什么要写两种方式? 区别 close: close只是关闭浏览器,但是不会退出 webdriver quit: q ...
- button submit你以为你阻止了默认事件?
前言 先解决掉一个误区: 很多人写button的时候,就这样写: <button><botton> 你认为就是默认的submit的时候,这时候就可能出问题了. 当然之所以你没有 ...
- CSS 中 MASK 实现图片遮罩登炫酷效果
顾名思义,mask 译为遮罩.在 CSS 中,mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域. 其实 mask 的出现已经有一段时间了,只是没有特别多 ...
- nuxt使用介绍[学习记录]
服务端渲染 传统服务端渲染 单页面应用 SPA nuxt 是什么 Nuxt.js 是一个基于 Vue.js 的通用应用框架. 通过对客户端/服务端基础架构的抽象组织,Nuxt.js 主要关注的是应用的 ...
- 还原数据库从远端环境到本地开发环境,数据SINGLE_USER问题
要还原到本地开发环境,首先要detach本地数据库或者是删除本地数据库,不然提示在使用中还原不了,但是搞过几次去做detach和drop数据库时,总是不成功,最后还出现个单用户模式,莫名奇妙 为此网上 ...
- C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++ 构造函数 构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用.它用于初始化对象的状态,例如为属性分配初始值.构造函数与类同名,且没有返回值类型. 构造函数类型 C++ 支持多种类 ...
- 【Oracle】Oracle数据库,第N大数据取值
Oracle数据库,第N大数据取值 没想到力扣还有数据库的练习,正好本菜鸡跑过来练手 要显示第二大的数据可以使用order by进行排序,然后用limit对显示的数据进行限制,limit1,1,以此来 ...