全套课件·LINQ从基础到项目实战

上传人:仙*** 文档编号:226487463 上传时间:2023-08-06 格式:PPT 页数:231 大小:4.04MB
收藏 版权申诉 举报 下载
全套课件·LINQ从基础到项目实战_第1页
第1页 / 共231页
全套课件·LINQ从基础到项目实战_第2页
第2页 / 共231页
全套课件·LINQ从基础到项目实战_第3页
第3页 / 共231页
资源描述:

《全套课件·LINQ从基础到项目实战》由会员分享,可在线阅读,更多相关《全套课件·LINQ从基础到项目实战(231页珍藏版)》请在装配图网上搜索。

1、第1章 LINQ概述本章简单介绍LINQ的概念、LINQ的设计目标以及LINQ的分类,通过3个使用LINQ的实例引领读者开始LINQ的学习。本章使用的实例代码运用了大量C#3.0语言的新特性,如对象和集合初始化器以及扩展方法等。读者在学习本章内容时,可不必太在意这些细节,将学习重点放在对LINQ的整体把握方面。章节内容1.1 什么是LINQ1.2 LINQ设计目标 1.3 LINQ的种类 1.4 LINQ应用实例 1.1 什么是LINQLINQ是Language Integrated Query的缩写,翻译成中文就是语言集成查询。LINQ是一系列的编程接口,借助于LINQ技术,可以使用一种统一

2、的方式查询各种不同类型的数据。LINQ是微软公司在Visual Studio 2008和.NET Framework 3.5版本中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。LINQ通过使用特定的语法,可以对数据库、对象以及XML等多种类型的数据进行查询操作。LINQ既可在新项目中使用,也可在现有项目中与非LINQ查询一起使用,唯一的要求是项目应面向.NET Framework 3.5版本。1.2 LINQ的设计目标LINQ采用一种开放性的设计架构,这种开放性不仅表现在其可以被多种.NET语言所支持,还表现在通过为不同类型的数据源开发相应的LINQ Provider,LINQ可

3、以在各种类型的数据源之间提供一个统一的访问接口。1.2 LINQ的设计目标LINQ的设计模型图 1.3 LINQ的种类LINQ to OBJECT LINQ to ADO.NET LINQ to XML 1.3.1 LINQ to OBJECT LINQ to OBJECT是用来访问对象集合的编程接口,对象集合里面的元素之间可以具有层次结构。在.NET中支持列举操作的各种对象类型,基本上都可以使用LINQ to OBJECT来进行操作。例如,可以使用LINQ to OBJECT来对一个整数类型数组中所有元素进行排序,也可以在一个自定义类型的集合中找出符合某些条件的元素子集合。1.3.1 LIN

4、Q to OBJECT 下面的代码实现了将一个整数类型数组numbers中所有元素按照从小到大的顺序排列,并放入集合items中的逻辑。/将一个整数类型数组numbers中所有元素按照从小到大的顺序排列,并放入集合items中using System;using System.Collections.Generic;using System.Text;using System.Linq;namespace Sample public class Test 1.3.1 LINQ to OBJECT static void Main(string args)/使用集合初始化器初始化整数类型数组nu

5、mbers int numbers=10,6,8,4,9,2,1,5,0;var items=from s in numbers orderby s select s;/输出结果 foreach(var item in items)Console.WriteLine(item);1.3.2 LINQ to ADO.NET LINQ to ADO.NET是用来访问关系模型数据的编程接口,其可以进一步分为LINQ to SQL、LINQ to Entities和LINQ to DataSet这3个子类别,每个子类别针对特定的关系模型数据。其中,LINQ to SQL在.NET自定义类型(class

6、)和数据库的物理表之间建立映射,通过操作自定义类型从而实现对数据库物理表的操作;LINQ to Entities与LINQ to SQL有相似之处,但是LINQ to Entities并不是直接在数据库物理表和自定义类型之间建立映射,而是采用了一个概念上的实体数据模型,这项技术目前还在持续的研发中,本书将不会涉及到LINQ to Entities的内容;LINQ to DataSet是使用LINQ来访问DataSet的接口。1.3.2 LINQ to ADO.NET 下面的代码实现了使用LINQ to SQL向数据库物理表中添加一条记录的逻辑。/使用LINQ to SQL向数据库物理表中添加一

7、条记录Book book=new Book();/生成一个实体类对象book.BOOKID=99;book.Book_Name=C#程序设计;book.Book_Author=张三;BookDataContext ctx=new BookDataContext();/只要与数据库通信,BookDataContext对象必不可少ctx.Book.InsertOnSubmit(book);/将需要修改的对象添加到BookDataContext对象中ctx.SubmitChanges();/通过BookDataContext对象将修改保存到数据库1.3.3 LINQ to XML LINQ to X

8、ML是用来访问XML数据的编程接口,XML目前已经成为被各种开发平台所支持的一种数据标准。关于XML,存在着各种各样的规格和模型,具体如下。XML Schema Definition(XSD):用来定义XML文档的结构。Extensible Stylesheet Language for Transformations(XSLT):将XML文档在不同的结构间转换。Document Object Model(DOM):用来管理在内存中的XML文档。Simple Object Access Protocol(SOAP):使用XML来实现平台间的互操作性。1.3.3 LINQ to XML 下面的代

9、码实现了使用LINQ to XML创建一个XML元素的逻辑。/使用LINQ to XML创建一个XML元素Books=new XElement(Books,new XElement(Book001,new XElement(Title,C程序设计),new XElement(Author,谭浩强),new XElement(Book002,new XElement(Title,算法与数据结构),new XElement(Author,张浩);1.4 LINQ应用实例本节将通过3个分别使用LINQ to OBJECT、LINQ to SQL和LINQ to XML的实例,初次体验LINQ的强大功

10、能以及使用LINQ的简单与高效。1.4.1 LINQ to OBJECT应用实例实例1-1将通过一个C#控制台应用程序来展示如何使用LINQ操作对象集合。运行Visual Studio 2008,新建项目,在打开的【新建项目】窗口的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【控制台应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Framework 3.5】平台类型,如图所示。1.4.1 LINQ to OBJECT应用实例【新建项目】窗口1.4.1 LINQ to OBJECT应用实例单击【确定】按钮后,在打开的Program.cs文件中输入

11、下面的代码。/LINQ to OBJECT实例代码using System;using System.Collections.Generic;using System.Linq;/使用Linq需引入的命名空间using System.Text;namespace sample1_1 class Program static void Main(string args)1.4.1 LINQ to OBJECT应用实例/使用集合初始化器构造一个数组greetings string greetings=hello,hello LINQ,how are you ;/使用var声明一个局部变量items

12、,变量类型自动识别 var items=from s in greetings /Linq关键字from、where和select where s.Length 10 /找出长度大于10的元素 select s;/输出满足条件的所有字符串 foreach(var item in items)Console.WriteLine(item);/为了方便看到输出结果 Console.ReadLine();1.4.2 LINQ to SQL应用实例实例1-2将通过一个C#Windows窗体应用程序来展示如何使用LINQ to SQL对数据库中的物理表进行操作。运行Visual Studio 2008,

13、新建项目,在打开的【新建项目】窗口的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【Windows窗体应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Framework 3.5】平台类型,如图所示。1.4.2 LINQ to SQL应用实例【新建项目】窗口1.4.2 LINQ to SQL应用实例单击【确定】按钮,打开Visual Studio 2008窗体设计器窗口,在打开的窗体中添加4个Button控件,控件名称分别为QueryButton、AddButton、ModifyButton和DeleteButton;然后向窗体添加一个DataGr

14、idView控件,控件名称为BookDataGridView。窗体布局如图所示。1.4.2 LINQ to SQL应用实例窗体布局1.4.3 LINQ to XML应用实例实例1-3将通过一个C#Windows窗体应用程序来展示如何使用LINQ对XML数据进行操作。运行Visual Studio 2008,新建项目,在打开的【新建项目】窗口中的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【Windows窗体应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Framework 3.5】平台类型,如图所示。1.4.3 LINQ to XML应用实例【

15、新建项目】窗口1.4.3 LINQ to XML应用实例单击【确定】按钮,打开Visual Studio 2008窗体设计器窗口,在打开的窗体中添加4个Button控件,控件名称分别为CreateXmlButton、ModifyXmlButton、SaveXmlButton和OpenXmlButton;然后向窗体添加一个TextBox控件,控件名称为XmlTextBox。窗体布局如图所示。1.4.3 LINQ to XML应用实例 窗体布局第2章 C#语言基础C#语言从2.0升级到3.0,并没有升级C#2.0的运行平台(CLR),只是在原有语法的基础上添加了一些新的特性,这些新特性的具体实现依

16、赖于一个面向C#3.0语言的编译器。使用C#3.0编译器编译过的代码可以无障碍地在原有支持C#2.0的CLR中运行,也就是说,完全可以在现有的.NET 2.0平台上运行编译过的.NET 3.0代码。章节内容2.1 C#2.0语言相关知识 2.2 C#3.0语言新特性2.1 C#2.0语言相关知识 C#2.0语言在很多方面扩充了原有的C#1.0语言,如提出了泛型、匿名方法的概念,使用泛型可以定义带有一个或者多个类型参数的方法或类等。泛型是LINQ技术实现的基石。本节将介绍与LINQ实现和使用关系密切的概念,即泛型、委托、匿名方法(C#3.0中Lambda表达式的基础)、yield关键字和IEnu

17、merable接口。2.1.1 泛型目前主流的编程语言中,大部分语言是强类型编程语言,这些编程语言要求程序中的变量或者对象必须有自己的类型,而且在不同类型之间进行转化还需要遵守一些规则。强类型编程语言有助于编写更加安全的代码,但是完全使用强类型语言编写出来的代码在某些方面也还是存在缺陷的。2.1.1 泛型下面的代码是Min方法的定义,该方法返回两个整数中的较小者。int Min(int a,int b)if(a b)return a;else return b;2.1.1 泛型新的Min方法定义的代码如下。object Min(object a,object b)if(a=0;i-)yield

18、 return i;2.2 C#3.0语言新特性C#3.0语言使得C#语言朝着函数式编程语言的方向发展,支持更多声明式编程的风格,添加了更多的新特性,LINQ大量使用了C#3.0语言新特性。2.2.1 局部变量类型推断局部变量类型推断(Local Type Inference)是指编译器可以自动推断局部变量的数据类型。开发者在定义局部变量时无需指定局部变量的数据类型,局部变量的数据类型由编译器根据相关上下文自动推断。局部类型推断可以让开发者以更少的代码完成相同的功能,通过使用var关键字来实现局部类型推断功能。2.2.2 Lambda表达式C#2.0语言推出了匿名方法的新特性,程序可以使用匿名

19、方法来动态地向一个已经存在的方法注入代码,编译器在编译匿名方法代码时将会自动生成相关辅助的委托对象。也就是说,使用匿名方法简化了代码的输入工作。C#3.0语言推出了Lambda表达式,使用Lambda表达式可以将匿名方法的语法进一步简化。另外,Lambda表达式还可以通过使用表达式树推迟代码的编译时间,使得代码可以在系统运行时动态编译,增加代码的灵活性。Lambda表达式主要用于代替匿名方法,以更加简洁的方式向方法注入一些短小的代码片段。2.2.3 表达式树一个Lambda表达式本质上是一个匿名方法,所以一个Lambda表达式可以赋值给一个具有下面类型的委托实例。public delegate

20、 T Func();/封装没有参数,返回值类型为T的方法委托,T是一种数据类型public delegate T Func(A0 arg0);/封装使用一个类型为A0的参数,返回值类型为T的方法public delegate T Func(A0 arg0,A1 arg1);public delegate T Func(A0 arg0,A1 arg1,A2 arg2);public delegate T Func(A0 arg0,A1 arg1,A2 arg2,A3 arg3);2.2.3 表达式树开发者无需自行定义这些委托类型,.NET Framework 3.5已经在System.Linq命

21、名空间中定义了这些委托类型。表达式树(expression tree)是Lambda表达式以树的形式表现出来的另外一种数据结构。一个表达式树是一个 System.Linq.Expressions.Expression 泛型的实例,委托类型T是与此表达式树相对应的Lambda表达式的委托类型(System.Linq命名空间中对应的Func类型),并不是所有的Lambda表达式都可以被转换成表达式树,只有那些只包含表达式主体内容的Lambda表达式(如(a,b)=a+b)才可以被转换。如果在主体中包含了声明性质的语句,则不能被转换。2.2.4 扩展方法扩展方法(Extension Methods)

22、是定义在静态类(static class)内部的静态方法(static method),开发者可以像使用一个类的实例方法(instance method)一样来使用这些扩展方法。例如,下面的代码直接针对字符串类型变量s调用扩展方法ToInt。String s=200;int i=s.ToInt();2.2.4 扩展方法ToInt方法看上去就像是类型String的一个实例方法一样。根据C#的语法,实例方法只能通过一个类的实例来调用,不能够直接通过类名来调用实例方法。与此相反,静态方法则只能通过类名来调用。String类的ToUpper方法就是一个实例方法的例子,不能通过String来调用ToUp

23、per方法,只能在一个String类型的对象上调用ToUpper方法,代码如下。string name=Joe;Console.WriteLine(name.ToUpper();2.2.4 扩展方法与ToUpper方法形成鲜明对比的是String类型的Format方法。Format方法是一个静态方法,这就要求Format方法的调用只能通过String类名来实现,代码如下。string firstName=Joe;string lastName=Rattz;string name=string.Format(0 1,firstName,lastName);Console.WriteLine(na

24、me);2.2.4 扩展方法扩展方法的本质是静态方法,只是此静态方法可通过被扩展类型的实例对象来调用,所以扩展方法不等同于被扩展类型的内部方法。其中,扩展方法对被扩展类型内部的访问有很大局限性。2.2.5 对象初始化表达式对象初始化表达式(Object Initialization Expressions)允许开发者在一条语句中给一个对象的一个或者多个域(field)或属性(property)进行初始化赋值。在C#3.0以前的版本中,只能对C#基本类型或者数组进行初始化赋值。下面的代码初始化整数类型、字符串类型和数组。int i=121;string s=abcde;string names=

25、new string LINQ,C#,VB.NET;2.2.5 对象初始化表达式如果需要给一个复合类型的实例赋值,如一个对象,需要使用下面的语法。MyClass data=new MyClass();/MyClass是一个已经定义的类data.Id=123;/Id是MyClass的字段或者属性data.Name=MyProcess;/Name是MyClass的字段或者属性data.Memory=123456;/Memory是MyClass的字段或者属性data.Address=No.505 Street;/Address是MyClass的字段或者属性2.2.6 集合初始化表达式集合初始化表达式

26、(Collection Initialization Expressions)允许开发者在一条语句中初始化一个集合对象,前提是此集合类型实现了System.Collections.IEnumerable接口,并且实现了相应的Add方法。下面的代码是使用集合初始化表达式的语句。var digits=new List 0,1,2,3,4,5,6,7,8,9;此语句与下面的代码效果是完全相同的。List digits=new List();digits.Add(0);digits.Add(1);digits.Add(2);digits.Add(9);2.2.7 匿名类型使用跟对象初始化表达式类似的语

27、法,可以创建匿名类型(Anonymous Types)。匿名类型一般用于在不单独定义一个类的前提下,将数据组合成一个对象。2.2.8 局部方法局部方法(Partial Methods)是C#3.0语言新添加的一个轻量级事件处理机制,虽然名称与局部类(Partial Class)有点类似,但是二者之间唯一的关联就是局部方法必须定义在一个局部类内部。局部方法是一种定义和实现可以分开的方法,也就是说,方法可以在一个局部类的一部分代码段进行定义,而在此局部类的另外一部分代码段实现。2.2.8 局部方法使用局部方法需要遵守的规则如下。局部方法只能在局部类内部定义和实现。局部方法必须使用partial修饰

28、符。局部方法是私有的,但是不能使用private修饰符修饰。局部方法返回值必须为void。局部方法可以没有实现代码。局部方法必须是静态的(static)。局部方法可以有参数。2.2.9 查询表达式查询表达式(Query Expressions)允许将LINQ查询语句写成类似SQL语句的形式,这是LINQ能够让许多开发者爱不释手的重要原因之一。查询表达式以from关键字开始(在C#中,所有的查询表达式都是区分大小写的),以select或者group关键字结束。其中,from关键字表明了LINQ将操作于哪个对象,该对象必须是一个实现了IEnumerable接口的类的实例。第3章 LINQ to O

29、BJECT本章结合实例介绍LINQ to OBJECT编程接口,包括一些必要的基础知识和使用技巧等。LINQ to OBJECT允许开发者使用LINQ对内存中的集合对象进行查询,这部分知识同时也是后面学习LINQ to SQL和LINQ to XML的基础,读者在学习时应重点掌握。章节内容3.1 LINQ to OBJECT基础3.2 延时标准查询操作符3.3 非延时标准查询操作符3.4 在ASP.NET和WinForm中使用LINQ to OBJECT3.1 LINQ to OBJECT基础 3.1.1 LINQ to OBJECT概述LINQ to OBJECT是用于操作内存对象的LINQ

30、编程接口,包含了大量的查询操作符,针对内存中的集合对象进行操作。下面是一段使用标准查询操作符where和select对一个数组里面的元素进行查询的代码。string greetings=hello,hello LINQ,how are you ;var items=from s in greetings where s.Length 10/where关键字是LINQ to OBJECT编程接口的标准操作符select s;/select关键字是LINQ to OBJECT编程接口的标准操作符/输出满足条件的所有字符串foreach(var item in items)Console.Write

31、Line(item);3.1.2 IEnumerable泛型接口、序列和标准查询操作符LINQ to OBJECT的实现基于IEnumerable泛型接口、序列(sequences)以及标准查询操作符(Standard Query Operators)等基本概念。其中,IEnumerable泛型接口是使用C#2.0泛型技术实现的一个接口,该接口与IEnumerable类似,允许对接口内部的元素进行列举操作;序列是一个专门术语,表示一个实现了IEnumerable接口的集合对象。3.1.2 IEnumerable泛型接口、序列和标准查询操作符例如,下面的代码定义了一个内部元素为string类型的

32、序列。/定义一个序列,使用泛型接口时类型T要明确指定具体类型IEnumerable strSequence;3.1.2 IEnumerable泛型接口、序列和标准查询操作符LINQ to OBJECT的大部分操作是针对序列的。标准查询操作符本质上是一些扩展方法(Extension Methods),这些扩展方法定义在静态类System.Linq.Enumerable中,其原型的第一个参数(带this修饰符的参数)是IEnumerable类型。3.1.2 IEnumerable泛型接口、序列和标准查询操作符要在代码中使用LINQ to OBJECT标准查询操作符,需要在代码中添加using Sy

33、stem.Linq指令,以引入必要的命名空间。标准查询操作符对象具体实现在System.Core.dll文件中,这个文件的引用会被集成开发环境(如Visual Studio 2008)在每次新建工程时自动加入工程引用中。3.2 延时标准查询操作符延时标准查询操作符是指具备延时查询特性的标准查询操作符,这些操作符构成了LINQ to OBJECT编程接口的最主要内容。3.2.1 Where操作符Where操作符用于限定输入集合中的元素,将符合条件的元素组织生成一个序列结果。Where操作符的方法原型有两个,第一个方法原型定义如下。public static IEnumerable Where(t

34、his IEnumerable source,Func predicate);3.2.2 Select操作符Select操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中的元素类型相同,也可以不同。Select操作符的方法原型也有两个,第一个方法原型的定义如下。public static IEnumerable Select(this IEnumerable source,Func selector);3.2.3 SelectMany操作符SelectMany操作符用于根据输入序列中的每一个元素,在输出序列中创建相应的零个或者多个元素,与上一节Sel

35、ect操作符不同,Select操作符会根据输入序列中的每一个元素创建一个对应的输出序列元素,然而SelectMany操作符可以创建多个。SelectMany操作符的方法原型有两个,第一个方法原型的定义如下。public static IEnumerable SelectMany(this IEnumerable source,FuncT,IEnumerable selector);3.2.4 Take操作符Take操作符用于从输入序列中返回指定数量的元素,其方法原型定义如下。public static IEnumerable Take(this IEnumerable source,int c

36、ount);Take操作符接收一个输入序列参数source和一个整数类型参数count,count代表须返回的元素个数。当Take操作符被调用时,将从输入序列source中第一个元素开始,顺序取count个元素一起组成一个新的序列作为结果返回。当count的值大于输入序列元素的个数时,将返回由输入序列中的所有元素所组成的新序列。3.2.5 TakeWhile操作符TakeWhile操作符用于从输入序列中返回指定数量且满足一定条件的元素,TakeWhile操作符有两个方法原型,第一个方法原型定义如下。public static IEnumerable TakeWhile(this IEnumer

37、able source,Func predicate);3.2.6 Skip操作符Skip操作符用于从输入序列中跳过指定数量的元素,返回由序列中剩余的元素所组成的新序列,其方法原型定义如下。public static IEnumerable Skip(this IEnumerable source,int count);Skip操作符接收一个整数类型参数用来指定需要跳过元素的个数,如果参数值大于输入序列元素的个数,Skip操作符返回一个空的序列。3.2.7 SkipWhile操作符SkipWhile操作符用于从输入序列中跳过满足一定条件指定数量的元素,与TakeWhile操作符类似,SkipW

38、hile操作符有两个方法原型,第一个方法原型定义如下。public static IEnumerable SkipWhile(this IEnumerable source,Func predicate);3.2.8 Concat操作符Concat操作符用于连接两个序列,生成一个新的序列,其方法原型定义如下。public static IEnumerable Concat(this IEnumerable first,IEnumerable second);Concat操作符接收first和second两个输入序列,根据这两个序列中的元素,生成一个包含全部元素的新序列作为返回值。3.2.9 O

39、rderBy操作符OrderBy操作符用于对输入序列中的元素进行排序,排序基于一个委托方法的返回值顺序,排序过程完成后,会返回一个类型为IOrderedEnumerable的集合对象。其中,IOrderedEnumerable接口实现了IEnumerable接口。OrderBy操作符有两个方法原型,第一个方法原型定义如下。public static IOrderedEnumerable OrderBy(this IEnumerable source,Func keySelector)whereK:IComparable;3.2.10 OrderByDescending操作符OrderByDes

40、cending操作符的功能与Orderby操作符基本相同,只是二者的排序方式不同,OrderBy是顺序排序,而OrderByDescending则是逆序排序。OrderByDescending操作符有两个方法原型,其方法原型定义如下。/第一个方法原型public static IOrderedEnumerable OrderByDescending(this IEnumerable source,Func keySelector)whereK:IComparable;/第二个方法原型public static IOrderedEnumerable OrderByDescending(this

41、IEnumerable source,Func keySelector,IComparer comparer);3.2.11 ThenBy操作符ThenBy操作符可以对一个类型为IOrderedEnumerable(OrderBy操作符和OrderByDescending操作符返回值类型)的序列再次按照特定的条件顺序排序。ThenBy操作符有两个方法原型,第一个方法原型代码定义如下。public static IOrderedEnumerable ThenBy(this IOrderedEnumerable source,Func keySelector)whereK:IComparable;

42、3.2.12 ThenByDescending操作符ThenByDescending操作符的功能与ThenBy操作符相比,排序的方式有所不同。ThenBy是顺序排序,而ThenByDescending是逆序排序。ThenByDescending操作符有两个方法原型,其方法原型定义如下。/第一个方法原型public static IOrderedEnumerable ThenByDescending(this IOrderedEnumerable source,Func keySelector)whereK:IComparable;/第二个方法原型public static IOrderedEn

43、umerable ThenByDescending(this IOrderedEnumerable source,Func keySelector,IComparer comparer);3.2.13 Reverse操作符Reverse操作符用于生成一个与输入序列中元素相同,但元素排列顺序相反的新序列,其方法原型定义如下。public static IEnumerable Reverse(this IEnumerable source);3.2.14 Join操作符类似于SQL语句中的Join语句用于连接多个表,LINQ to OBJECT中的Join操作符可以用来连接两个输入序列,其方法原型

44、定义如下。public static IEnumerable Join(this IEnumerable outer,IEnumerable inner,Func outerKeySelector,Func innerKeySelector,Func resultSelector);3.2.15 GroupJoin操作符GroupJoin操作符也用于连接两个输入序列,但与Join操作符稍有不同。Join操作符在列举outer序列元素时,会将一个outer序列元素和其对应的inner序列元素作为一组参数传递给委托resultSelector,这就意味着如果某一个outer序列元素有多个对应的in

45、ner序列元素,Join操作符将会分多次将outer序列元素和每一个对应的inner序列元素传递给委托resultSelector。使用GroupJoin操作符时,如果某一个outer序列元素有多个对应的inner序列元素,那么这多个对应的inner序列元素会作为一个序列一次性传递给委托resultSelector,可以针对此序列添加一些处理逻辑。3.2.16 GroupBy操作符GroupBy操作符类似SQL语言中的Group By语句,这里的GroupBy操作符用于将输入序列中的元素进行分组。GroupBy操作符有4个方法原型,第一个方法原型定义如下。public static IEnum

46、erableIGrouping GroupBy(this IEnumerable source,Func keySelector);3.2.17 Distinct操作符Distinct操作符类似于SQL语言中的Distinct语句,这里的Distinct操作符也用于去除一个序列中的重复元素。Distinct操作符的方法原型定义如下。public static IEnumerable Distinct(this IEnumerable source);3.2.18 Union操作符Union操作符用于将两个序列中的元素合并生成一个新的序列,新序列将自动去除重复的元素。Union操作符的方法原型定

47、义如下。public static IEnumerable Union(this IEnumerable first,IEnumerable second);3.2.19 Intersect操作符Intersect操作符会将两个输入序列中的重复元素,即同时存在于两个输入序列中的元素挑选出来,生成一个新的序列。Intersect操作符的方法原型定义如下。public static IEnumerable Intersect(this IEnumerable first,IEnumerable second);3.2.20 Except操作符Except操作符可以实现一种序列之间的“减法”运算,它

48、返回两个序列中存在于第一个序列但不存在于第二个序列的元素所组成的新序列。Except操作符的方法原型定义如下。public static IEnumerable Except(this IEnumerable first,IEnumerable second);3.2.21 Cast操作符LINQ提供了Cast操作符,可以使用Cast操作符将类型为IEnumerable的集合对象转换成为IEnumerable类型的集合对象。Cast操作符是定义在IEnumerable类型上的扩展方法,不能够在IEnumerable类型对象上调用。Cast操作符的方法原型定义如下。public static I

49、Enumerable Cast(this IEnumerable source);3.2.23 AsEnumerable操作符AsEnumerable操作符可以将一个类型为IEnumerable的输入序列转换成一个IEnumerable类型的输出序列,其主要用于将一个实现了IEnumerable接口的对象(该对象可能还实现了其他接口)转换成一个标准的IEnumerable接口对象。在LINQ中,不同领域的LINQ实现(如LINQ To SQL、LINQ To XML等)都有专属于自己领域的操作符,这些领域专有的操作符一般是定义在那些既实现了IEnumerable接口也还实现了其他接口的类型上的

50、扩展方法。3.2.24 DefaultIfEmpty操作符DefaultIfEmpty操作符可以用来为一个空的输入序列生成一个对应的含有默认元素(如果序列元素类型为引用类型,则生成一个相同类型的null元素;若为值类型,生成相应的默认值)的新序列。由于有些标准操作符在一个空的序列上调用时会抛出一个异常,DefaultIfEmpty操作符可以将一个空的序列转换成一个包含默认元素的序列。DefaultIfEmpty操作符有两个方法原型,第一个方法原型的定义如下。public static IEnumerable DefaultIfEmpty(this IEnumerable source);3.2

51、.25 Range操作符Range操作符用于辅助生成一个整数序列,其方法原型定义如下。public static IEnumerable Range(int start,int count);3.2.26 Repeat操作符Repeat操作符用于生成一个包含指定数量重复元素的序列,其方法原型定义如下。public static IEnumerable Repeat(T element,int count);3.2.27 Empty操作符Empty操作符用于生成一个包含指定类型元素的空序列,其方法原型定义如下。public static IEnumerable Empty();Empty操作符并

52、不是一个扩展方法,只是定义在System.Linq.Enumerable上的一个普通的静态方法。Empty操作符的返回类型为IEnumerable。3.3 非延时标准查询操作符非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用。3.3.1 ToArray操作符ToArray操作符用于将一个输入序列转换成一个数组,其方法原型定义如下。public static T ToArray(this IEnumerable source);根据原型定义,ToArray操作符接收一个包含元素类型为T的输入序列source,生成一个元素类型为T的数组返回。

53、3.3.2 ToList操作符ToList操作符用于将一个输入序列转换成一个List(System.Collections.Generic.List)对象。List是一种表示可通过索引访问的强类型列表对象,内部提供了用于对列表进行搜索、排序和操作的相关方法。3.3.3 ToDictionary操作符ToDictionary操作符用于将一个输入序列转换成一个Dictionary(System.Collections.Generic.Dictionary)集合对象。Dictionary是一种表示键和值的集合类型,它允许元素以键-值对的方式存储在集合内部,每一个键-值对的键必须全局唯一,而且一个键只

54、能对应一个值,可以通过键来查询其对应的元素值。3.3.4 ToLookup操作符ToLookup操作符可以将一个输入序列转换成一个ILookup(System.Linq.ILookup)集合对象。ILookup集合对象与Dictionary集合对象非常相似,不同的是,在Dictionary中一个键(key)只能对应一个元素;而在ILookup中,一个键可以对应一组元素(一个序列)。ToLookup操作符的使用与ToDictionary操作符非常相似,也是有4个方法原型,第一个方法原型定义如下。public static ILookup ToLookup(this IEnumerable sou

55、rce,Func keySelector);3.3.5 SequenceEqual操作符SequenceEqual操作符用于判断两个序列是否相等,其方法原型有两个,第一个方法原型定义如下。public static bool SequenceEqual(this IEnumerable first,IEnumerable second);此方法原型接收first和second两个序列参数,使用System.Object.Equals方法分别比较两个序列中的对应元素是否相等。如果两个序列元素个数相同并且对应元素相等,则返回true,否则返回false。3.3.6 First操作符First操作符

56、用于返回输入序列的第一个元素或者满足条件的第一个元素,其有两个方法原型,第一个方法原型定义如下。public static T First(this IEnumerable source);此方法原型接收一个输入序列参数source,并且返回source序列的第一个元素。3.3.7 FirstOrDefault操作符FirstOrDefault操作符的使用与First操作符非常相似,只是在没有找到元素时,First操作符会抛出一个异常对象,而FirstOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当没有找到元素时,FirstOrDefault操作

57、符会返回一个null结果。FirstOrDefault操作符有两个方法原型,第一个方法原型定义如下。public static T FirstOrDefault(this IEnumerable source);3.3.8 Last操作符Last操作符用于返回输入序列的最后一个元素或者满足条件的最后一个元素,其有两个方法原型,第一个方法原型定义如下。public static T Last(this IEnumerable source);3.3.9 LastOrDefault操作符LastOrDefault操作符的使用与Last操作符非常相似,只是在没有找到元素时,Last操作符会抛出一个异

58、常对象,而LastOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当没有找到元素时,LastOrDefault操作符会返回一个null结果。LastOrDefault操作符有两个方法原型,第一个方法原型定义如下。public static T LastOrDefault(this IEnumerable source);3.3.10 Single操作符Single操作符用于从一个只含有一个元素的输入序列中返回唯一的元素或者满足特定条件的唯一元素。如果输入序列中的元素个数为零或者多于一个,Single操作符会抛出一个异常。Single操作符的方法原型

59、有两个,第一个方法原型定义如下。public static T Single(this IEnumerable source);3.3.11 SingleOrDefault操作符SingleOrDefault操作符的使用与Single操作符非常相似,只是在没有找到元素时,Single操作符会抛出一个异常对象,而SingleOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当没有找到元素时,SingleOrDefault操作符会返回一个null结果。SingleOrDefault操作符有两个方法原型,第一个方法原型定义如下。public static

60、T SingleOrDefault(this IEnumerable source);3.3.12 ElementAt操作符ElementAt操作符用于返回输入序列中指定位置的元素,其方法原型定义如下。public static T ElementAt(this IEnumerable source,int index);3.3.13 ElementAtOrDefault操作符ElementAtOrDefault操作符的使用与ElementAt操作符非常相似,只是在指定的位置索引值不合法的情况下(小于0或者大于或等于序列元素个数),ElementAt操作符会抛出一个异常对象,而ElementA

61、tOrDefault操作符会返回一个相关类型默认值元素。ElementAtOrDefault操作符的方法原型定义如下。public static T ElementAtOrDefault(this IEnumerable source,int index);3.3.14 Any操作符Any操作符用于判断一个输入序列中是否含有元素或者含有满足特定条件的元素,其有两个方法原型,第一个方法原型定义如下。public static bool Any(this IEnumerable source);此方法原型接收一个输入序列参数source,如果source中有至少一个元素存在,则Any操作符返回tr

62、ue,否则返回false。3.3.15 All操作符All操作符用于判断输入序列中的所有元素是否全部满足指定条件,其方法原型定义如下。public static bool All(this IEnumerable source,Func predicate);3.3.16 Contains操作符Contains操作符用于判断输入序列中是否含有指定的元素,其有两个方法原型,第一个方法原型的定义如下。public static bool Contains(this IEnumerable source,T value);3.3.17 Count操作符Count操作符用于获取输入序列的元素个数或者满

63、足某个特定条件的元素个数,其有两个方法原型,第一个方法原型定义如下。public static int Count(this IEnumerable source);此方法原型接收一个输入序列参数source,返回值为source中的元素个数。3.3.18 LongCount操作符LongCount操作符的使用与Count操作符基本相同,不同的是,Count操作符以int类型返回元素个数,而LongCount操作符以Long类型返回元素个数。LongCount操作符的方法原型有两个,第一个方法原型定义如下。public static long LongCount(this IEnumerabl

64、e source);第二个方法原型定义如下。public static long LongCount(this IEnumerable source,Func predicate);3.3.19 Sum操作符Sum操作符用于计算输入序列中所有元素数值总和,使用Sum操作符时需要注意,输入序列中的元素类型只能是int、long、double或者decimal等数值型数据类型。Sum操作符有两个方法原型,第一个方法原型定义如下。public static Numeric Sum(this IEnumerable source);Sum操作符的第二个方法原型定义如下。public static Nu

65、meric Sum(this IEnumerable source,Func selector);3.3.20 Min操作符Min操作符用于获取输入序列中所有元素的最小值。使用Min操作符需要注意,输入序列的元素类型只能是int、long、double、decimal等数值型数据类型或者是实现了IComparable接口的数据类型。3.3.21 Max操作符Max操作符用于获取输入序列中所有元素的最大值。Max操作符在使用上与Min操作符基本相同,读者可以参考Min操作符的相关实例代码学习掌握,下面代码只列出Max操作符的4个方法原型定义。3.3.21 Max操作符/Max操作符第一个扩展方法

66、原型public static Numeric Max(this IEnumerable source);/Max操作符第二个扩展方法原型public static Numeric Max(this IEnumerable source,Func selector);/Max操作符第三个扩展方法原型public static T Max(this IEnumerable source);/Max操作符第四个扩展方法原型public static S Max(this IEnumerable source,Func selector);3.3.22 Average操作符Average操作符用于计算输入序列中全体元素的平均值。使用Average操作符时需要注意,输入序列中的元素类型只能是int、long、double或者decimal等数值型数据类型。Average操作符有两个方法原型,第一个方法原型定义如下。public static Result Average(this IEnumerable source);Average操作符的第二个方法原型定义如下。public static

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!