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配置文件中声 ...
随机推荐
- 一种基于DeltaE(CIE 1976)的找色算法
// QuickFinder.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include <iostream> #define _ ...
- Go 语言中结构体的使用和示例
结构体(简称struct)用于创建不同数据类型的成员集合,放入一个单一的变量中.虽然数组用于将相同数据类型的多个值存储在单一变量中,但结构体用于将不同数据类型的多个值存储在单一变量中.结构体对于将数据 ...
- 掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验
原生智能是HarmonyOS NEXT的核心亮点之一,依托HarmonyOS SDK丰富全面的开放能力,开发者只需通过几行代码,即可快速实现AI功能.新浪新闻作为鸿蒙原生应用开发的先行者之一,从有声资 ...
- pip提示升级pip版本
今天在进行pip安装库的时候发现下面出现一段黄色的字体,如下图: 自由翻译: 大概意思就是说我现在安装的pip的版本是 20.0.2,最新版本是 20.1,希望我可以更新到最新的版本,并告诉了我怎么安 ...
- 数据驱动ddt简单使用
安装 pip install ddt 数据驱动 ddt 可以使用的地方很多 比如: 1. 做接口测试的参数化 2. 读取自动化测试关键字模型的测试用例 等 demo import ddt, unit ...
- identity4 系列————用户数据持久化篇[六]
前言 前面的例子已经将各种情形下的例子已经介绍了一遍,那么后面就是用户数据持久化该如何处理了. 正文 例子位置: https://github.com/IdentityServer/IdentityS ...
- 重新点亮linux 命令树————进程的控制[二十二]
前言 简单整理一下进程的控制 正文 进程优先级 nice 从-20-19,值越小,优先级越高 renice 从新设置优先级 进程的作业控制: job 那么先来创建一个进程. 那么使用top -p 26 ...
- html 渲染原理
渲染 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree) Layout(回 ...
- Deep Learning on Graphs: A Survey第五章自动编码论文总结
论文地址:https://arxiv.org/pdf/1812.04202.pdf 最近老师让我们读的一片论文,已经开组会讲完了,我负责的是第五章,图的自动编码,现在再总结一遍,便于后者研读.因为这篇 ...
- redis如何在保持读写分离+高可用的架构下,还能横向扩容支撑1T+海量数据
单机redis在海量数据面前的瓶颈. 怎么才能够突破单机瓶颈,让redis支撑海量数据? redis集群架构 redis cluster 支撑N个redis master node,每个master ...