前言:先贴结果

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方法是如何工作的的更多相关文章

  1. 转载Linq中GroupBy方法的使用总结

    Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class St ...

  2. C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法

    分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...

  3. 登录页面和FORM的职责不对称,处理方法,刷新工作流程

    登录页面和FORM的职责不对称,处理方法,刷新工作流程:

  4. C#DataTable 使用GroupBy方法的lamda 表达式和Linq语句写法

    https://www.cnblogs.com/johnblogs/p/6006867.html DataTable ds = new DataTable(); //1.lamda 表达式写法(推荐) ...

  5. Linq中GroupBy方法的使用总结(转)

    Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class St ...

  6. Linq中GroupBy方法的使用总结(转载)

    from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...

  7. pandas.DataFrame的groupby()方法的基本使用

    pandas.DataFrame的groupby()方法是一个特别常用和有用的方法.让我们快速掌握groupby()方法的基础使用,从此数据分析又多一法宝. 首先导入package: import p ...

  8. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  9. [转]Linq中GroupBy方法的使用总结

    Demo模型类: public class StudentScore { public int ID { set; get; } public string Name { set; get; } pu ...

  10. 理解Struts2的Action中的setter方法是怎么工作的

    接触过webwork和Struts2的同行都应该知道, 提交表单的时候,只要Action中的属性有setter 方法,这些表单数据就可以正确赋值到Action中属性里:另外对于Spring配置文件中声 ...

随机推荐

  1. Git 13 暂存代码

    如果当前分支的功能还没开发完,无法提交代码. 但出现了紧急情况(比如线上BUG),需要立即切换到其他分支进行开发. 此时可以先暂存当前分支代码,等切换回当前分支的时候再恢复. 1.暂存当前分支变更: ...

  2. CTR预估系列模型漫谈

    FM FM的主要内容 了解fm模型之前,需要先说一下lr带入一下场景.lr作为早期ctr预估里面的模型,其速度上有着无可比拟的优势,而偏偏ctr场景下伴随着有大量的离散特征,高维稀疏特征,这个很适合l ...

  3. redis 简单整理——客户端哨兵模式[三十]

    前言 简单介绍一下客户端的哨兵模式连接. 正文 Sentinel节点集合具备了监控.通知.自动故障转移.配置提供者若干 功能,也就是说实际上最了解主节点信息的就是Sentinel节点集合, 而各个 主 ...

  4. 本地使用ts配置

    1.需要安装的依赖 "dependencies": { "html-webpack-plugin": "^5.5.0", "ts- ...

  5. linux系统关闭指定端口

    linux系统关闭指定端口 关闭指定端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent systemctl restart f ...

  6. 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator

    作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...

  7. 用手机写代码:基于 Serverless 的在线编程能力探索

    ​简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本.本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编 ...

  8. [Py] Python dict 倒序操作

    倒序操作很简单,使用 reversed( ) 方法,原本是 ['a', 'b', 'c'],倒序后就是 ['c', 'b', 'a'] Ref:在线运行Python代码 Refer:Python di ...

  9. 简化 Python 日志管理:Loguru 入门指南

    简化 Python 日志管理:Loguru 入门指南 在开发和维护软件项目时,高效的日志管理系统对于监控应用程序的行为.调试代码和追踪异常至关重要.Python 的标准日志模块虽然功能强大,但其配置和 ...

  10. 【python爬虫案例】用python爬豆瓣音乐TOP250排行榜!

    目录 一.爬虫对象-豆瓣音乐TOP250 二.python爬虫代码讲解 三.同步视频 四.获取完整源码 一.爬虫对象-豆瓣音乐TOP250 今天我们分享一期python爬虫案例讲解.爬取对象是,豆瓣音 ...