这里我们以 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. java 引用传递及基本应用

  2. C++重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  3. Robot Framework 安装步骤

    1. 安装python 2.7.11, 并添加环境变量到PATH.在cmd验证python是否安装成功.   2. 解压pip-8.1.1.tar.gz,执行python setup.py insta ...

  4. Html中的文本框和单选按钮

    Html中的文本框和单选按钮用来制作页面的登录注册使用.. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  5. JS学习笔记(不断更新)

    1 基础知识 为什么学习 JavaScript? JavaScript web 开发人员必须学习的 门语言中的一门: HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的 ...

  6. Oracle的表锁死以及解锁

    Oracle的表锁死以及解锁 oracle 查看锁死的表,锁死的进程. select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_na ...

  7. Oracle初级函数的使用

    --1.字符函数--UPPER(string|column) 可以将字符转成大写select upper('helloword') from dual;select upper(ename) from ...

  8. HTTPS 双向认证构建移动设备安全体系

    HTTPS 双向认证构建移动设备安全体系 对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证.这个时候我们可以使用Https的双向认证机制来实现这个功能. 单向认证:保证server是 ...

  9. [Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)

    局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段时间找工作时接触到的一种衡量文本相似度的算法.局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论 ...

  10. 在js中实现邮箱格式的验证

    在js中实现邮箱格式的验证 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><htm ...