public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector);

// 假设有这两个集合 studs ; classes; 注意,两个集合的类型TOuter和TInner是可以不一样的,两个key未必要有连系,可以比较就行。
// 即,下面的 inner.ClassId可以是 inner.GradeId, 但是要有实际意义,否则就是瞎写。 两个key的比较方式默认是比较是否相等。但是可以自己写比较器。
// 调用方式为:
// studs.Join(classes,outer=>outer.ClassId,inner=>inner.ClassId,(stud,cls)=>new{StudentId=stud.StudentId,GradeId=cls.GradeId}); // 其功能就是通过两张表的某个字段进行比较,这两个字段相等(默认)则选出这两条记录,将两条记录联合增减后得到新类型的记录,然后继续Outer表的游标不变,继续查找
// Inner表的下一条记录,直到把Inner表的记录查找完毕;然后才取出Outer表的下一条记录。这里类似两层 for循环
// 于Inner表的记录进行比较,有符合的则又将它们联合增减,如果没有符合的,则不会选出记录进行联合,因为传给第三个委托是需要 两个参数的,这两个参数就是通过查找获得
// 没有查找到自然没办法联合。 故Join(...)返回的 IEnumerable<TResult> s, s的元素个数是不定的,与 两张表和 两个关键字,及比较方式都有关系。 // Join不仅可以用于将两个不同的表关联,还可以将一个表进行自关联,即Outer表和Inner表是一张表。 // 实现方式类似:
foreach(var stud in studs)
{
  var key1=outerKeySelector(stud);
  foreach(var cls in classes) // 关键点在这里,它并不是说找到第一个就break,而是全部都找,符合的都添加到返回的list中
  {
    var key2=innerKeySelector(cls);
    if(key1==key2)
    {
      list.Add(resultSelector(stud,cls));
    }
  }
}
return list; //

再来看GroupJoin的声明:

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector);  // 这里的IEnumerable<TInner>就是和声明Join有很大的不同

// 这里 IEnumerable<TInner> listForOuterKey是 在Inner表中找出所有记录的innerKey匹配上一层outerKey的记录组成一个 IEnumerable<TInner> blockInnerList
// 所以,GroupJoin的Outer和Inner是有调用与被调用之分的。 这里resultSelector中对 blockInnerList的利用一般也是 num=blockInnerList.Count();等等

GroupJoin和Join的声明及调用的更多相关文章

  1. C#中声明、调用和配置事件的演示源码

    下面的内容是关于C#中声明.调用和配置事件的演示的内容,应该能对大伙有些好处. using System;namespace MyCollections { using System.Collecti ...

  2. JavaScript 之有趣的函数(函数声明、调用、预解析、作用域)

    前言:“函数是对象,函数名是指针.”,函数名仅仅是指向函数的指针,与其他包含函数指针的变量没有什么区别,话句话说,一个函数可能有多个名字. -1.函数声明,function+函数名称.调用方法:函数名 ...

  3. python函数声明和调用(18)

    函数是指代码片段,可以重复调用,比如我们前面文章接触到的type()/len()等等都是函数,这些函数是python的内置函数,python底层封装后用于实现某些功能. 一.函数的定义 在Python ...

  4. Javascript 函数声明、调用、闭包

    1 # Javascript 函数声明.调用.闭包 2 # 一.函数声明 3 # 1.直接声明.浏览器在执行前,会先将变量和函数声明进行提升. 4 fn(); 5 function fn () { 6 ...

  5. C#之方法的声明与调用

    //params关键字使用 class Program { static void Main(string[] args){ , , , }; Console.WriteLine(AddFunctio ...

  6. javascript函数的声明和调用

    × 目录 [1]函数的声明方式 [2]函数的调用方式 [3]两种声明方式的区别 函数:将完成某一特定功能的代码集合起来,可以重复使用的代码块. ---------------------------- ...

  7. 初识JAVA——方法声明和调用

      class TempConverter{ public static void main(String[]args) { changeTemp("132"); } //定义花摄 ...

  8. Python类中的装饰器在当前类中的声明与调用

    [本文出自天外归云的博客园] 我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器.代码如下: class Test(): xx = False def __in ...

  9. C#中方法,方法声明,方法调用和方法重载!

      一,定义:方法是具有名称的可执行代码块. 二,方法的声明:声明方法的语法包括以下五个部分: 1,访问权限修饰符,这个是可选的参数,默认值是私有访问private,即只能从声明它的类的内部访问. 2 ...

随机推荐

  1. Java防止SQL注入(转)

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  2. bash的管道符与重定向

    管道符"|"可以用来将前面的程序的标准输出stdout(=1)重定向到后一个程序的stdin(=0),但是忽略了stderr. 在bash中使用2>&1 可以表示将s ...

  3. VirtualBox安装MS-DOS6.22(图文教程)

    最近在读一些计算机发展史之类的文献,总感觉的纸上得来终觉浅,所以打算自己装一个MS-DOS,体验一下远古的操作系统!可以google到MS-DOS的安装文件: 为什么要分成三个呢?可以看到,每个大小都 ...

  4. Scrum Meeting 20161209

    本周Sprint Master 史少帅 会议概要 工作总结: · 陈双, 王永超: 打分功能合并到主分支并且测试成功 · 鲍航波 录音上传.下载接口封装完成,可供调用 · 侯宇泰, 史少帅: 修复录音 ...

  5. html页面制作css基本设置

    html{ height: 100%;} *{ margin: 0; padding: 0;}/* tell the browser to render HTML 5 elements as bloc ...

  6. 5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下

    list_display展示多对多关系的内容 表结构关系 表一 class Server(models.Model): asset = models.OneToOneField('Asset') cr ...

  7. My97 DatePicker 日期选择插件.

    My97DatePicker是一个纯js写的时间插件,体积较小,更可以自己扩展皮肤,且样式不和页面相冲突,有多钟配置,近期项目用了一下感觉还不错...分享给大家 软件官网:http://www.my9 ...

  8. myql Connect

    mysql折腾笔记 2014-01-05 10:58 经常吹嘘自己玩过各种数据库. redis, mysql, sqlite, mongodb..常用数据库都不在话下,不料今天却在远程连接mysql上 ...

  9. JQ-动画合集(ing...)

    一:给向上按钮加动画,让页面卷回上面而不是生硬跳转.js $('#topBtn').click(function(){ $('html,body').animate({scrollTop: '0px' ...

  10. ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令:   是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...