1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,1,章,LINQ,概述,本章简单介绍LINQ的概念、LINQ的设计目标以及LINQ的分类,通过3个使用LINQ的实例引领读者开始LINQ的学习。本章使用的实例代码运用了大量C#3.0语言的新特性,如对象和集合初始化器以及扩展方法等。读者在学习本章内容时,可不必太在意这些细节,将学习重点放在对LINQ的整体把握方面。,章节内容,1.1,什么是,LINQ,1.2 LINQ,设计目标,1.3 LINQ,的种类,1.4 LINQ,应用实例,1.1,什么是,LINQ,LINQ,是,Language Inte
2、grated Query,的缩写,翻译成中文就是语言集成查询。,LINQ,是一系列的编程接口,借助于,LINQ,技术,可以使用一种统一的方式查询各种不同类型的数据。,LINQ,是微软公司在,Visual Studio 2008,和,.NET Framework 3.5,版本中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。,LINQ,通过使用特定的语法,可以对数据库、对象以及,XML,等多种类型的数据进行查询操作。,LINQ,既可在新项目中使用,也可在现有项目中与非,LINQ,查询一起使用,唯一的要求是项目应面向,.NET Framework 3.5,版本。,1.2 LINQ的设计
3、目标,LINQ,采用一种开放性的设计架构,这种开放性不仅表现在其可以被多种,.NET,语言所支持,还表现在通过为不同类型的数据源开发相应的,LINQ Provider,,,LINQ,可以在各种类型的数据源之间提供一个统一的访问接口。,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,中支持列举操作的各种对象类型,基本上都可以使
4、用,LINQ to OBJECT,来进行操作。例如,可以使用,LINQ to OBJECT,来对一个整数类型数组中所有元素进行排序,也可以在一个自定义类型的集合中找出符合某些条件的元素子集合。,1.,3.1 LINQ to OBJECT,下面的代码实现了将一个整数类型数组,numbers,中所有元素按照从小到大的顺序排列,并放入集合,items,中的逻辑。,/,将一个整数类型数组,numbers,中所有元素按照从小到大的顺序排列,并放入集合,items,中,using System;,using System.Collections.Generic;,using System.Text;,us
5、ing System.Linq;,namespace Sample,public class Test,1.,3.1 LINQ to OBJECT,static void Main(string args),/,使用集合初始化器初始化整数类型数组,numbers,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 t
6、o ADO.NET,是用来访问关系模型数据的编程接口,其可以进一步分为,LINQ to SQL,、,LINQ to Entities,和,LINQ to DataSet,这,3,个子类别,每个子类别针对特定的关系模型数据。其中,,LINQ to SQL,在,.NET,自定义类型(,class,)和数据库的物理表之间建立映射,通过操作自定义类型从而实现对数据库物理表的操作;,LINQ to Entities,与,LINQ to SQL,有相似之处,但是,LINQ to Entities,并不是直接在数据库物理表和自定义类型之间建立映射,而是采用了一个概念上的实体数据模型,这项技术目前还在持续的研
7、发中,本书将不会涉及到,LINQ to Entities,的内容;,LINQ to DataSet,是使用,LINQ,来访问,DataSet,的接口。,1.,3.2 LINQ to ADO.NET,下面的代码实现了使用LINQ to SQL向数据库物理表中添加一条记录的逻辑,。,/,使用,LINQ to SQL,向数据库物理表中添加一条记录,Book book=new Book();/,生成一个实体类对象,book.BOOKID=99;,book.Book_Name=C#,程序设计,;,book.Book_Author=,张三,;,BookDataContext ctx=new BookDat
8、aContext();,/,只要与数据库通信,,BookDataContext,对象必不可少,ctx.Book.InsertOnSubmit(book);,/,将需要修改的对象添加到,BookDataContext,对象中,ctx.SubmitChanges();/,通过,BookDataContext,对象将修改保存到数据库,1.,3.3 LINQ to,XML,LINQ to XML,是用来访问,XML,数据的编程接口,,XML,目前已经成为被各种开发平台所支持的一种数据标准。关于,XML,,存在着各种各样的规格和模型,具体如下。,XML Schema Definition,(,XSD,)
9、用来定义,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,下面的代码实现了使用LINQ to XML创建一个XML元素的逻辑。,/使用LINQ to XML创建一个XML元素,Books=new XElement(
10、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的强大功能以及使用LINQ的简单与高效。,1.4.1 LINQ to OBJECT,应用实例,实例,1-1,将通过一个,C#,控制台应用程序来展示
11、如何使用,LINQ,操作对象集合。运行,Visual Studio 2008,,新建项目,在打开的,【,新建项目,】,窗口的,【,项目类型,】,列表框中选择,【Visual C#】,,在,【,模板,】,列表框中选择,【,控制台应用程序,】,。注意,在,【,新建项目,】,窗口右上角的下拉列表框中选择,【.NET Framework 3.5】,平台类型,如图所示。,1.4.1 LINQ to OBJECT,应用实例,【,新建项目,】,窗口,1.4.1 LINQ to OBJECT,应用实例,单击,【,确定,】,按钮后,在打开的,Program.cs,文件中输入下面的代码。,/LINQ to OBJ
12、ECT,实例代码,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,声明一个局部变量,item
13、s,,变量类型自动识别,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,对数据库中的物理表
14、进行操作。运行,Visual Studio 2008,,新建项目,在打开的,【,新建项目,】,窗口的,【,项目类型,】,列表框中选择,【Visual C#】,,在,【,模板,】,列表框中选择,【Windows,窗体应用程序,】,。注意,在,【,新建项目,】,窗口右上角的下拉列表框中选择,【.NET Framework 3.5】,平台类型,如图所示。,1.4.2 LINQ to SQL,应用实例,【,新建项目,】,窗口,1.4.2 LINQ to SQL,应用实例,单击,【,确定,】,按钮,打开,Visual Studio 2008,窗体设计器窗口,在打开的窗体中添加,4,个,Button,控件
15、控件名称分别为,QueryButton,、,AddButton,、,ModifyButton,和,DeleteButton,;然后向窗体添加一个,DataGridView,控件,控件名称为,BookDataGridView,。窗体布局如图所示。,1.4.2 LINQ to SQL,应用实例,窗体布局,1.4.3 LINQ to XML,应用实例,实例,1-3,将通过一个,C#Windows,窗体应用程序来展示如何使用,LINQ,对,XML,数据进行操作。运行,Visual Studio 2008,,新建项目,在打开的,【,新建项目,】,窗口中的,【,项目类型,】,列表框中选择,【Visual
16、 C#】,,在,【,模板,】,列表框中选择,【Windows,窗体应用程序,】,。注意,在,【,新建项目,】,窗口右上角的下拉列表框中选择,【.NET Framework 3.5】,平台类型,如图所示。,1.4.3 LINQ to XML,应用实例,【,新建项目,】,窗口,1.4.3 LINQ to XML,应用实例,单击,【,确定,】,按钮,打开,Visual Studio 2008,窗体设计器窗口,在打开的窗体中添加,4,个,Button,控件,控件名称分别为,CreateXmlButton,、,ModifyXmlButton,、,SaveXmlButton,和,OpenXmlButton
17、然后向窗体添加一个,TextBox,控件,控件名称为,XmlTextBox,。窗体布局如图所示。,1.4.3 LINQ to XML,应用实例,窗体布局,第,3,章,LINQ to OBJECT,本章结合实例介绍,LINQ to OBJECT,编程接口,包括一些必要的基础知识和使用技巧等。,LINQ to OBJECT,允许开发者使用,LINQ,对内存中的集合对象进行查询,这部分知识同时也是后面学习,LINQ to SQL,和,LINQ to XML,的基础,读者在学习时应重点掌握。,章节内容,3.1 LINQ to OBJECT,基础,3.2 延时标准查询操作符,3.3 非延时标准查询操
18、作符,3.4,在,ASP.NET,和,WinForm,中使用,LINQ to OBJECT,3.1 LINQ to OBJECT,基础,3.1.1 LINQ to OBJECT,概述,LINQ to OBJECT,是用于操作内存对象的,LINQ,编程接口,包含了大量的查询操作符,针对内存中的集合对象进行操作。,下面是一段使用标准查询操作符,where,和,select,对一个数组里面的元素进行查询的代码。,string greetings=hello,hello LINQ,how are you ;,var items=,from s in greetings,where s.Length 1
19、0/where,关键字是,LINQ to OBJECT,编程接口的标准操作符,select s;/select,关键字是,LINQ to OBJECT,编程接口的标准操作符,/,输出满足条件的所有字符串,foreach(var item in items),Console.WriteLine(item);,3.1.2 IEnumerable,泛型接口、序列和标准查询操作符,LINQ to OBJECT的实现基于IEnumerable泛型接口、序列(sequences)以及标准查询操作符(Standard Query Operators)等基本概念。其中,IEnumerable泛型接口是使用C#
20、2.0泛型技术实现的一个接口,该接口与IEnumerable类似,允许对接口内部的元素进行列举操作;序列是一个专门术语,表示一个实现了IEnumerable接口的集合对象。,3.1.2 IEnumerable,泛型接口、序列和标准查询操作符,例如,下面的代码定义了一个内部元素为string类型的序列。,/定义一个序列,使用泛型接口时类型T要明确指定具体类型,IEnumerable strSequence;,3.1.2 IEnumerable,泛型接口、序列和标准查询操作符,LINQ to OBJECT的大部分操作是针对序列的。标准查询操作符本质上是一些扩展方法(Extension Method
21、s),这些扩展方法定义在静态类System.Linq.Enumerable中,其原型的第一个参数(带this修饰符的参数)是IEnumerable类型。,3.1.2 IEnumerable,泛型接口、序列和标准查询操作符,要在代码中使用LINQ to OBJECT标准查询操作符,需要在代码中添加using System.Linq指令,以引入必要的命名空间。标准查询操作符对象具体实现在System.Core.dll文件中,这个文件的引用会被集成开发环境(如Visual Studio 2008)在每次新建工程时自动加入工程引用中。,3.2 延时标准查询操作符,延时标准查询操作符是指具备延时查询特性
22、的标准查询操作符,这些操作符构成了LINQ to OBJECT编程接口的最主要内容。,3.2.1 Where,操作符,Where操作符用于限定输入集合中的元素,将符合条件的元素组织生成一个序列结果。Where操作符的方法原型有两个,第一个方法原型定义如下。,public static IEnumerable Where(,this IEnumerable source,Func predicate);,3.2.2 Select,操作符,Select操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中的元素类型相同,也可以不同。Select操作符的方法原
23、型也有两个,第一个方法原型的定义如下。,public static IEnumerable Select(,this IEnumerable source,Func selector);,3.2.3 SelectMany,操作符,SelectMany操作符用于根据输入序列中的每一个元素,在输出序列中创建相应的零个或者多个元素,与上一节Select操作符不同,Select操作符会根据输入序列中的每一个元素创建一个对应的输出序列元素,然而SelectMany操作符可以创建多个。SelectMany操作符的方法原型有两个,第一个方法原型的定义如下。,public static IEnumerable
24、 SelectMany(,this IEnumerable source,Func selector);,3.2.4 Take,操作符,Take操作符用于从输入序列中返回指定数量的元素,其方法原型定义如下。,public static IEnumerable Take(,this IEnumerable source,int count);,Take操作符接收一个输入序列参数source和一个整数类型参数count,count代表须返回的元素个数。当Take操作符被调用时,将从输入序列source中第一个元素开始,顺序取count个元素一起组成一个新的序列作为结果返回。当count的值大于输入
25、序列元素的个数时,将返回由输入序列中的所有元素所组成的新序列。,3.2.5 TakeWhile,操作符,TakeWhile操作符用于从输入序列中返回指定数量且满足一定条件的元素,TakeWhile操作符有两个方法原型,第一个方法原型定义如下。,public static IEnumerable TakeWhile(,this IEnumerable source,Func predicate);,3.2.6 Skip,操作符,Skip操作符用于从输入序列中跳过指定数量的元素,返回由序列中剩余的元素所组成的新序列,其方法原型定义如下。,public static IEnumerable Skip
26、this IEnumerable source,int count);,Skip操作符接收一个整数类型参数用来指定需要跳过元素的个数,如果参数值大于输入序列元素的个数,Skip操作符返回一个空的序列。,3.2.7 SkipWhile,操作符,SkipWhile操作符用于从输入序列中跳过满足一定条件指定数量的元素,与TakeWhile操作符类似,SkipWhile操作符有两个方法原型,第一个方法原型定义如下。,public static IEnumerable SkipWhile(,this IEnumerable source,Func predicate);,3.2.8 Concat,操
27、作符,Concat操作符用于连接两个序列,生成一个新的序列,其方法原型定义如下。,public static IEnumerable Concat(,this IEnumerable first,IEnumerable second);,Concat操作符接收first和second两个输入序列,根据这两个序列中的元素,生成一个包含全部元素的新序列作为返回值。,3.2.9 OrderBy,操作符,OrderBy操作符用于对输入序列中的元素进行排序,排序基于一个委托方法的返回值顺序,排序过程完成后,会返回一个类型为IOrderedEnumerable的集合对象。其中,IOrderedEnumer
28、able接口实现了IEnumerable接口。OrderBy操作符有两个方法原型,第一个方法原型定义如下。,public static IOrderedEnumerable OrderBy(,this IEnumerable source,Func keySelector),where,K:IComparable;,3.2.10 OrderByDescending,操作符,OrderByDescending操作符的功能与Orderby操作符基本相同,只是二者的排序方式不同,OrderBy是顺序排序,而OrderByDescending则是逆序排序。OrderByDescending操作符有两个
29、方法原型,其方法原型定义如下。,/第一个方法原型,public static IOrderedEnumerable OrderByDescending(,this IEnumerable source,Func keySelector),where,K:IComparable;,/第二个方法原型,public static IOrderedEnumerable OrderByDescending(,this IEnumerable source,Func keySelector,IComparer comparer);,3.2.11 ThenBy,操作符,ThenBy操作符可以对一个类型为IO
30、rderedEnumerable(OrderBy操作符和OrderByDescending操作符返回值类型)的序列再次按照特定的条件顺序排序。ThenBy操作符有两个方法原型,第一个方法原型代码定义如下。,public static IOrderedEnumerable ThenBy(,this IOrderedEnumerable source,Func keySelector),where,K:IComparable;,3.2.12 ThenByDescending,操作符,ThenByDescending操作符的功能与ThenBy操作符相比,排序的方式有所不同。ThenBy是顺序排序,而
31、ThenByDescending是逆序排序。ThenByDescending操作符有两个方法原型,其方法原型定义如下。,/第一个方法原型,public static IOrderedEnumerable ThenByDescending(,this IOrderedEnumerable source,Func keySelector),where,K:IComparable;,/第二个方法原型,public static IOrderedEnumerable ThenByDescending(,this IOrderedEnumerable source,Func keySelector,IC
32、omparer comparer);,3.2.13 Reverse,操作符,Reverse操作符用于生成一个与输入序列中元素相同,但元素排列顺序相反的新序列,其方法原型定义如下。,public static IEnumerable Reverse(,this IEnumerable source);,3.2.14 Join,操作符,类似于SQL语句中的Join语句用于连接多个表,LINQ to OBJECT中的Join操作符可以用来连接两个输入序列,其方法原型定义如下。,public static IEnumerable Join(,this IEnumerable outer,IEnumer
33、able inner,Func outerKeySelector,Func innerKeySelector,Func resultSelector);,3.2.15 GroupJoin,操作符,GroupJoin操作符也用于连接两个输入序列,但与Join操作符稍有不同。Join操作符在列举outer序列元素时,会将一个outer序列元素和其对应的inner序列元素作为一组参数传递给委托resultSelector,这就意味着如果某一个outer序列元素有多个对应的inner序列元素,Join操作符将会分多次将outer序列元素和每一个对应的inner序列元素传递给委托resultSelect
34、or。使用GroupJoin操作符时,如果某一个outer序列元素有多个对应的inner序列元素,那么这多个对应的inner序列元素会作为一个序列一次性传递给委托resultSelector,可以针对此序列添加一些处理逻辑。,3.2.16 GroupBy,操作符,GroupBy操作符类似SQL语言中的Group By语句,这里的GroupBy操作符用于将输入序列中的元素进行分组。GroupBy操作符有4个方法原型,第一个方法原型定义如下。,public static IEnumerable GroupBy(,this IEnumerable source,Func keySelector);,
35、3.2.17 Distinct,操作符,Distinct操作符类似于SQL语言中的Distinct语句,这里的Distinct操作符也用于去除一个序列中的重复元素。Distinct操作符的方法原型定义如下。,public static IEnumerable Distinct(,this IEnumerable source);,3.2.18 Union,操作符,Union操作符用于将两个序列中的元素合并生成一个新的序列,新序列将自动去除重复的元素。Union操作符的方法原型定义如下。,public static IEnumerable Union(,this IEnumerable firs
36、t,IEnumerable second);,3.2.19 Intersect,操作符,Intersect操作符会将两个输入序列中的重复元素,即同时存在于两个输入序列中的元素挑选出来,生成一个新的序列。Intersect操作符的方法原型定义如下。,public static IEnumerable Intersect(,this IEnumerable first,IEnumerable second);,3.2.20 Except,操作符,Except操作符可以实现一种序列之间的“减法”运算,它返回两个序列中存在于第一个序列但不存在于第二个序列的元素所组成的新序列。Except操作符的方法原
37、型定义如下。,public static IEnumerable Except(,this IEnumerable first,IEnumerable second);,3.2.21 Cast,操作符,LINQ提供了Cast操作符,可以使用Cast操作符将类型为IEnumerable的集合对象转换成为IEnumerable类型的集合对象。Cast操作符是定义在IEnumerable类型上的扩展方法,不能够在IEnumerable类型对象上调用。Cast操作符的方法原型定义如下。,public static IEnumerable Cast(,this IEnumerable source);,
38、3.2.23 AsEnumerable,操作符,AsEnumerable操作符可以将一个类型为IEnumerable的输入序列转换成一个IEnumerable类型的输出序列,其主要用于将一个实现了IEnumerable接口的对象(该对象可能还实现了其他接口)转换成一个标准的IEnumerable接口对象。在LINQ中,不同领域的LINQ实现(如LINQ To SQL、LINQ To XML等)都有专属于自己领域的操作符,这些领域专有的操作符一般是定义在那些既实现了IEnumerable接口也还实现了其他接口的类型上的扩展方法。,3.2.24 DefaultIfEmpty,操作符,Default
39、IfEmpty操作符可以用来为一个空的输入序列生成一个对应的含有默认元素(如果序列元素类型为引用类型,则生成一个相同类型的null元素;若为值类型,生成相应的默认值)的新序列。由于有些标准操作符在一个空的序列上调用时会抛出一个异常,DefaultIfEmpty操作符可以将一个空的序列转换成一个包含默认元素的序列。DefaultIfEmpty操作符有两个方法原型,第一个方法原型的定义如下。,public static IEnumerable DefaultIfEmpty(,this IEnumerable source);,3.2.25 Range,操作符,Range操作符用于辅助生成一个整数序
40、列,其方法原型定义如下。,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操作符并不是一个扩展方法,只是定义在Syste
41、m.Linq.Enumerable上的一个普通的静态方法。Empty操作符的返回类型为IEnumerable。,3.3 非延时标准查询操作符,非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用。,3.3.1 ToArray,操作符,ToArray操作符用于将一个输入序列转换成一个数组,其方法原型定义如下。,public static T ToArray(,this IEnumerable source);,根据原型定义,ToArray操作符接收一个包含元素类型为T的输入序列source,生成一个元素类型为T的数组返回。,3.3.2 ToLi
42、st,操作符,ToList操作符用于将一个输入序列转换成一个List(System.Collections.Generic.List)对象。List是一种表示可通过索引访问的强类型列表对象,内部提供了用于对列表进行搜索、排序和操作的相关方法。,3.3.3 ToDictionary,操作符,ToDictionary操作符用于将一个输入序列转换成一个Dictionary(System.Collections.Generic.Dictionary)集合对象。Dictionary是一种表示键和值的集合类型,它允许元素以键-值对的方式存储在集合内部,每一个键-值对的键必须全局唯一,而且一个键只能对应一个
43、值,可以通过键来查询其对应的元素值。,3.3.4 ToLookup,操作符,ToLookup操作符可以将一个输入序列转换成一个ILookup(System.Linq.ILookup)集合对象。ILookup集合对象与Dictionary集合对象非常相似,不同的是,在Dictionary中一个键(key)只能对应一个元素;而在ILookup中,一个键可以对应一组元素(一个序列)。ToLookup操作符的使用与ToDictionary操作符非常相似,也是有4个方法原型,第一个方法原型定义如下。,public static ILookup ToLookup(,this IEnumerable sou
44、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
45、 First,操作符,First操作符用于返回输入序列的第一个元素或者满足条件的第一个元素,其有两个方法原型,第一个方法原型定义如下。,public static T First(this IEnumerable source);,此方法原型接收一个输入序列参数source,并且返回source序列的第一个元素。,3.3.7 FirstOrDefault,操作符,FirstOrDefault操作符的使用与First操作符非常相似,只是在没有找到元素时,First操作符会抛出一个异常对象,而FirstOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当
46、没有找到元素时,FirstOrDefault操作符会返回一个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操作符的使用与La
47、st操作符非常相似,只是在没有找到元素时,Last操作符会抛出一个异常对象,而LastOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当没有找到元素时,LastOrDefault操作符会返回一个null结果。LastOrDefault操作符有两个方法原型,第一个方法原型定义如下。,public static T LastOrDefault(,this IEnumerable source);,3.3.10 Single,操作符,Single操作符用于从一个只含有一个元素的输入序列中返回唯一的元素或者满足特定条件的唯一元素。如果输入序列中的元素个数为
48、零或者多于一个,Single操作符会抛出一个异常。Single操作符的方法原型有两个,第一个方法原型定义如下。,public static T Single(,this IEnumerable source);,3.3.11 SingleOrDefault,操作符,SingleOrDefault操作符的使用与Single操作符非常相似,只是在没有找到元素时,Single操作符会抛出一个异常对象,而SingleOrDefault操作符会返回一个相关类型默认值元素。例如,如果输入序列的元素类型为引用类型,当没有找到元素时,SingleOrDefault操作符会返回一个null结果。SingleOr
49、Default操作符有两个方法原型,第一个方法原型定义如下。,public static 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操作符非常相似,只是在指定的位置索引值不合法
50、的情况下(小于0或者大于或等于序列元素个数),ElementAt操作符会抛出一个异常对象,而ElementAtOrDefault操作符会返回一个相关类型默认值元素。ElementAtOrDefault操作符的方法原型定义如下。,public static T ElementAtOrDefault(,this IEnumerable source,int index);,3.3.14 Any,操作符,Any操作符用于判断一个输入序列中是否含有元素或者含有满足特定条件的元素,其有两个方法原型,第一个方法原型定义如下。,public static bool Any(this IEnumerable
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818