这里我们以 List<Student> studs作为 source,但是注意,studs中的学生可以是分别属于不同的班级和年级

先看GroupBy的第一种声明:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);

// IGrouping<TKey,TSource> 对应的类的声明可以粗糙的认为:class Gro { TKey key;List<TSource> list;} 且Gro实现了IEnumerable<TSource>; 对 Gro进行foreach
// 时,循环访问的是 其内部的 list的元素。
// 这种声明的调用方式最简单 studs.GroupBy(stu=>stu.ClassId); // 即以 ClassId作为分组的Key,返回的是类似 Lookup对象

第二种声明:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector);  // 一般而言这种是用来返回 {Key,Count,TotalXX,Average}

// 第一个委托是选出 key值,即stu.ClassId,去重后 将每个key值 赋给第二个委托的 key变量,将该key值对应的 n个IEnumerable<TSource>赋给listForKey,并
// 由 key和listForKey 进行增减或平均或总计,返回 TResult对象;本函数返回的 IEnumerable<TResult> 集合listResult,listResult的元素个数等于分组的组数
// 调用方式为:studs.GroupBy(stu=>stu.ClassId,(key,listForKey)=>new{ClassId=key,Count=listForKey.Count(),/*如果有身高属性还可以有总身高等等*/});
// 第二个委托中有 TKey参数一般是为了方便,其实不用也可以,如: new{ClassId=listForKey[0].ClassId,......},但是,这样自然是不美观的。。

第三种声明:

public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);

// 这个其实和第一种声明实现的 功能差不多,第一个声明中 IGrouping内的集合的元素类型默认就是 进行分组的数据表或集合中元素的类型,这里就是将该类型进行了自定义
// 调用形式为:studs.GroupBy(stu=>stu.ClassId,stud=>new{ClassId=stud.ClassId,......}); // stu和stud实际上可以一样,因为它们在GroupBy属于不同的层

第四种声明:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

// 这个就是声明二和声明三进行整合得到的新的 GroupBy(...);  我个人是觉得没太大用,因为TElement是由TSource衍生出来的,直接用声明二就好了??
// 除非是TElement是对TSource进行了扩展,这时候或许有一些用。。。

GroupBy(..)的四种声明方式的理解及调用的更多相关文章

  1. js的数据类型、函数、流程控制及变量的四种声明方式

    运算符 基本运算符 加 + 减 - 乘 * 除 / 取余 % 自增 ++ eg: 1++ 或 ++1 自减 -- eg: 1-- 或 --1 注:++或--写在前面表示优先级最高,先进行自增或者自减 ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  3. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  4. [转][Android]Android数据的四种存储方式

    android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...

  5. Android开发之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...

  6. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  7. SpringMVC的REST风格的四种请求方式

    一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET  ====== 获 取资源 2.POST ======新建资源 ...

  8. 前端基础----CSS语法、CSS四种引入方式、CSS选择器、CSS属性操作

    一.CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 例如: h1 {color:red; font-size:14px;} 二.CSS四种引入方式 1,行内式 行内式是在标 ...

  9. [Android]Android数据的四种存储方式

    存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...

随机推荐

  1. BZOJ3670 [Noi2014]动物园

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. java String类

    String 是一个类 所以他不是基本数据类型 而是引用数据类型 String 两种实例化方式:1.直接赋值 String name = "xxxxxx";2. String na ...

  3. mysql定时任务

    查看event是否开启: show variables like '%sche%'; 将事件计划开启: set global event_scheduler=1; 关闭事件任务: alter even ...

  4. nodeJS 简单的模块。

    nodeJS是的模块流程: 第一步:创建模块,如:student.js 第二步:导出模块,如:exports.add = function(){} 第三步:加载模块,如:var student = r ...

  5. EmployeeTest

    package fourthf; public class EmployeeTest { public static void main(String[] args) { // TODO Auto-g ...

  6. Spring MVC学习笔记——返回JSON对象

    1.想要GET请求返回JSON对象,首先需要导入jackson-all-1.9.4.jar包 2.在控制器中添加不同的show()方法 //show()方法返回JSON对象 @RequestMappi ...

  7. windows7下Wamp安装php扩展imagick(转)

    ImageMagick是一套功能强大.稳定而且免费的工具集和开发包,可以用来读.写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等 ...

  8. react+react-router+webpack+express+nodejs

    react+react-router+webpack+express+nodejs   做SinglePageApplication 支持热加载+ES6 有开发模式和发布模式 https://gith ...

  9. struts.xml

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    " ...

  10. AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题

    场景: Select初始化之后,选中select的某个选项 通过AngularJS更新select的选项 错误写法: HTML(使用ng-repeat) <div ng-app="Te ...