前言:先贴结果

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. C# 项目打包详解--赞

    项目打包流程如下: 第一步:项目必须先安装 Microsoft Visual Studio Installer Projects  安装步骤:打开VS-->工具-->扩展和更新--> ...

  2. 民生直销银行终端安全修炼秘籍之HMS Core两大安全能力

    在金融行业数字化转型浪潮下,传统商业银行先后推出手机银行.直销银行等移动金融客户端.作为民生银行"数字金融"的试验田,民生直销银行始终秉承"简单的银行"发展理念 ...

  3. 运动App如何实现端侧后台保活,让运动记录更完整?

    你在锻炼健身时,有没有遇到这样的情况?辛辛苦苦锻炼了几小时,却发现App停止了运行,本次运动并没有被记录到App上,从而失去了一个查看完整运动数据的机会? 运动类App是通过手机或者穿戴设备的传感器, ...

  4. 京东一面:如何在SpringBoot启动时执行特定代码?有哪些方式?

    引言 Spring Boot 提供了许多便捷的功能和特性,使得开发者可以更加轻松地构建强大.高效的应用程序.然而,在应用程序启动时执行一些初始化操作是至关重要的,它可以确保应用程序在启动后处于预期的状 ...

  5. CRC报错查看

    前言 查看交换机接口是否有CRC报错,本案例以华三交换机为例. CRC是指循环冗余校验错 使用仪器测试链路.链路质量差或者线路光信号衰减过大会导致报文在传输过程中出错.如链路故障请更换网线或光纤. 与 ...

  6. Solon 的事务管理工具类(TranUtils)

    Solon 在编码上,是强调注解与手写并重的一个风格.它有个 @Tran 注解,用于事务管理(可以参考:<事务的全局控制及应用>).这里,主要是讲讲它的手动处理工具类 TranUtils. ...

  7. Python阿里云消息推送调用API

    很多公司测试APP推送时候,应该也是很头疼:推送环境:测试.正式,稍不注意就把测试的push到正式上,导致所有用户都收到 例子很多: 其实阿里.极光都有推送Api,直接调用API就ok,特别是有的公司 ...

  8. 对中间件概念的理解,如何封装 node 中间件

    一.是什么 中间件(Middleware)是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享.功能共享的目的 在 ...

  9. Node 中的 Stream ?应用场景?

    一.是什么 流(Stream),是一种数据传输手段,是端到端信息交换的一种方式,是有顺序的,是逐块读取数据.处理内容,用于顺序读取输入或写入输出 在很多时候,流(Stream)是字节流(Byte St ...

  10. Ubuntu下部署gitlab

    1.安装gitlab服务 1.安装依赖 在ubuntu下使用快捷键ctrl+alt+T打开命令行窗口,然后运行下面命令 sudo apt update sudo apt-get upgrade sud ...