GroupJoin和Join的声明及调用

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();等等
时间: 2024-12-27 19:33:34

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

方法的声明和调用——java

方法只有声明和调用,方法里只能调用其它方法:方法外,只能声明方法. 调用方法时参数顺序不能颠倒. 同一个类里的方法可以直接调用或访问其他方法或属性; 但静态方法例外,静态方法只能调用或访问其他的静态方法或静态属性; 要想在静态方法中调用非静态方法或非静态属性,可以利用对象调用或访问. 只有静态的成员变量和成员方法:没有静态的局部变量. static 修饰的属性.方法保存在内存中的datasegment.

javascript--函数的声明及调用/JS中代码执行顺序

[函数的声明及调用] 1.函数声明格式: function 函数名(参数1,参数2,参数3--){ //函数体 return 结果: } 函数调用的格式: 函数名(参数1的值,参数2的值,--): 事件调用:事件名=函数名(): 2.函数声明的几点强调: ① 函数的声明,必须符合小驼峰法则(首字母小写,之后每个单词首字母大写): ② 参数的列表,可以有参数,可以无参数.分别称为有参函数,无参函数: ③ 声明函数时的参数列表,称为"形参列表"(变量的名): 调用函数时的参数列表,称为&q

黑马程序员——OC有参函数声明以及调用

黑马程序员——OC有参函数声明以及调用 ------- android培训.ios培训.期待与您交流! ---------- 1 //没有参数有返回值方法的声明实现及调用 2 3 //有参数有返回值方法的声明实现及调用 4 5 #import <Foundation/Foundation.h> 6 7 @interface cacu:NSObject 8 9 { 10 11 //实例变量 12 13 @public; 14 15 int _num1; 16 17 int _num2; 18 1

python函数声明和调用(18)

函数是指代码片段,可以重复调用,比如我们前面文章接触到的type()/len()等等都是函数,这些函数是python的内置函数,python底层封装后用于实现某些功能. 一.函数的定义 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回:如果没有return语句,默认返回None: def functionname( parameters ): "函数说明" function_sui

js方法的声明与调用

具名函数直接调用 function foo()   {   } foo(); (2)匿名函数通过引用来调用 fooRef = function()   {   } fooRef(); (3)没有引用的匿名函数调用1 (function()  { }()); (4)没有引用的匿名函数调用2 (function()  {  })(); (5)没有引用的匿名函数调用3 void function()  { }(); 图1.1,图1.2表明了这两种表达式的运算过程是不一样的,图1.1中是用强制运算符使函

Java中的函数(方法)声明和调用

目前学习了有无返回值和有无参数的函数. 其次就是函数的调用,需要参数的函数在调用时应该传入参数,参数的类型和数量应和声明是一样. 返回值主要是在函数执行完后返回一个数据. 其主要作用就是将不同功能的代码分割成多个部分,为重复使用该代码提供方便. //函数(方法)的基本概念 //(怎么用,什么时候用) //public static void main(String [] args){} //不带参数不带返回值的函数 public static void xxxXxx1(){ } //带参数不带返

委托声明及调用

//委托的声明 public delegate void NoReturnNoPara(); public delegate void NoReturnWithPara(int x,int y); public delegate string NoPara(); public delegate DateTime WithPara(string name,int size); NoReturnWithPara method = new NoReturnWithPara(ShowAdd);//因为在

JavaScript忍者阅读随笔(一):函数声明、调用

在JavaScript中,函数是作为一等成员而存在的,由此,非常有必要掌握JavaScript中函数的知识,最近几天阅读了JavaScript忍者的第三章和第四章前面的部分,做一个总结. JavaScript函数声明: JavaScript函数是使用 函数字面量 进行声明 从而创建函数的. 形如 function name(arg1,arg2)//函数的名称可选 { code; }; 函数的作用域: 在JavaScript中没有块级作用域,只有函数作用域.也就是说在JavaScript中,作用域

javascript函数的声明和调用

× 目录 [1]函数的声明方式 [2]函数的调用方式 [3]两种声明方式的区别 函数:将完成某一特定功能的代码集合起来,可以重复使用的代码块. ------------------------------------- 一.函数的声明方式(创建) A.基本语法   function  关键字   function 函数名([参数1],[参数2]....){      函数体      [retrun]  //返回值    } function math () { var num1=parseFl