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. 10个常见的Node.js面试题

    如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...

  2. CGI, FastCGI, WSGI, uWSGI, uwsgi简述

    CGI 通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据.CGI描述了服务器和请求处理程 ...

  3. Python学习总结 01 配置环境

    1 查看python的版本 ubuntu16.04 LTS系统下默认安装了python2.7.12 和python3.5.2, 她们在/usr/bin/下可以找到, 默认用python2.7.8 1) ...

  4. c# c++ oc java || mac android ios

    Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台) http://blog.csdn.net/fg5823820/article/details/ ...

  5. web app开发利器 - iscroll4 解决方案

    存在即是道理,iscroll会诞生,主要是因为无论是在iphone.ipod.android 或是更早前的移动webkit都没有提供一种原生的方式来支持在一个固定高度的容器内滚动内容, 这个不幸的规则 ...

  6. Shell脚本学习第二课·

    Shell文件包含 shell也可以包含外部脚本,语法格式如下: . filename 或 source filename 例如创建两个shell脚本. 脚本1:test1.sh url = &quo ...

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

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

  8. js传入参数为字符串问题

    示例: var device_mac="11qweq234ert"; //第一种方式会报错:Onclick SyntaxError: identifier starts immed ...

  9. UIAlertController

    楼主在整理项目的警告,于是乎你懂的. 然后自己整理了一下以后方便自己忘了之后能及时找到它 关于UIAlertController .h文件的解析 /** 关于UIAlertController的解析 ...

  10. SQL处理数组,字符串转换为数组

    原文转载自:http://hi.baidu.com/gagahjt/item/fd081316450f05028ebde413 一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串 ...