LINQ to Objects(用于集合、文件、字符串对象的LINQ)

LINQ to  Object是LINQ的基础,而LINQ to SQL、LINQ to  XML是中间LINQ提供程序,它们主要把数据源转换成LINQ to Objects兼容的类型,以便与LINQ to Objects进行操作。LINQ to Objcets就是直接 对IEnumerable或IEnumberable<T>集合使用LINQ查询。

 

LINQ标准查询运算符概述

LINQ标准查询运算符是依靠一组扩展方法来实现的。而这些扩展方法分别是System.Linq.Enumerable和System.Linq.Querable这两个静态类中定义,它们是泛型IEnumerable<T>接口和泛型 IQueryable<T>接口的实现类型。

LINQ不仅能查询 实现泛型IEnumerable<T>接口或泛型 IQueryable<T>接口的类型,也能查询 实现IEnumerable接口的类型。

这是因为,在Enumerable静态 类中,定义了两个方法,即Cast<TResul>(IEnumerable)和OfType<TRsult>(IEnumerable),它们把IEnumerable接口类型转换成了泛型IEnumerable<T>接口类型。Queryable类中也有类似这样的方法。

Enumerable的扩展方法用来操作内存对象,采用线程流程 ,即每个运算符会被按顺序执行。这种执行方法如果操作类似关系型数据库的数据源,效率会非常地下,所以Queryable类型重新定义了这些扩展方法,把LINQ表达式拆解为表达式目录树,提供程序就可以根据表达式目录生成树 生成关系型数据库的查询语句,即SQL命令,然后进行 相关操作。

每个查询运算符的执行行为不同,大致分为立即执行和延期执行,延期执行的运算符将在枚举元素的时刻执行 。

 

Enumerable类的介绍

Enumerable类位于程序既System.Core.dll中,命名空间属于System.Linq.直接从System.Object继承,存在于版本号是3.5及以上的.NET框架中。

Enumerable类是静态类 ,不能实例化 和被继承,成员只有一组静态和扩展方法。

下面将按照延期执行和立即 执行这两种分类进行讲解》

一用于延期执行 的Enumerable类方法成员

1.Take方法

Take方法用于 从一个序列的开头返回指定数量的元素

DemoTake控制台应用程序,返回序列的前N个元素:

2.TakeWhile方法

TakeWhile方法 用于获取序列中从开头算起复合条件的元素,知道遇到不符合条件 的元素为止

DemoTakeWhile1的控制台应用程序,返回序列中 符合条件 的元素:

从运行结果看到,TakeWhile方法只返回1个元素,这是因为 TakeWhile检测到第2个 元素时,发现不符合条件,就 停止了输出,如果第一个元素 就不符合条件,TakeWhile则不会有任何输出,这是TakeWhile的特性。

DemoTakeWhile2控制台应用程序,返回序列中 复合 条件的元素

3.Skip方法

Skip方法用于跳过序列中指定 数量的元素,然后返回剩余的元素

DemoSkip控制台应用程序,跳过序列中的前N个元素

4.SkipWhile方法

SkipWhile方法用于只要满足指定的条件,就跳过序列中的元素 ,然后返回剩余元素。

DemoSkipWhile1控制台应用程序跳过序列中符合条件的元素

 

跳过序列中复合 条件 的元素(2)

DemoSkipWhile2:

 

Take、TakeWhile、Skip、SkipWhile这4个方法,用于返回序列中 的部分元素,它们之间互为补充关系。这几个 方法,非常适合用于在 对查询结果 进行 分页的处理 上。

DemoPaginate控制台应用程序:

这个实例是对内存序列进行分页输出,数据库内容 的用LINQ分页也是这样,只是使用LINQ to SQL的类型而已。

 

6.Reverse方法

Reverse方法用于反转序列中元素的顺序

DemoReverse反向显示字符串

7.   Distinct方法

Distinct方法用于获取不重复的元素,也可以说是过滤掉重复的元素 ,Distinct方法的作用跟SQL语句中的Distinct关键字类似

DemoDistinct1控制台应用程序去掉序列 中重复的元素

DemoDistinct2控制台应用程序,使用自定义比较器过滤序列中重复的元素:

在 项目中添加名称 为MyEqualityComparer类

只是一个 实现了泛型IEqualityComparer<TSource>接口的相等比较器。

Program.cs:

 

8. Union方法

Union方法用于合并两个 序列,并去掉 重复元素。

DemoUnion1控制台应用程序合并两个数组 并去掉重复元素

DemoDistinct2使用自定义比较器合并两个 数组并去掉重复的元素

自定义比较器依然使用 前面DemoDistinct2实例刚建立的MyEqualityComparer比较器。

Program.cs:

 

8.Union方法

Union方法用于合并两个序列,并去掉重复 元素

DemoUnion1控制太 应用程序合并两个数组并去掉重复元素

DemoDistinct2使用自定义比较器合并两个数组并去掉重复的元素

添加现有项:MyEqualityComparer.cs

Program.cs:

9.Concat方法:

Concat方法用于连接两个序列,与,Union方法不同的是不会过滤掉重复的元素

DemoConcat控制台应用程序连接两数组

10.Intersect方法

Intersect方法用于生成两个序列的交集。生成交集,就是把2个序列中相同的元素提取出来,建立一个新的序列。

DemoIntersect1控制台应用程序找出2个数组中相同的元素

DemoDistinct2使用自定义比较器找出两个数组中相同的元素:

添加现有项:MyEqualityComparer.cs

Program.cs:

11.Except方法:

Except方法用于生成两个序列的差集,生成差集,就是办两个序列中不同的元素提取出来,建立一个新的序列。

DemoExcept1找出两个数组中不同的元素

DemoExcept2:使用自定义比较器找出两个数组中不同的元素

添加现有项:MyEqualityComparer.cs

Program.cs

12.Range方法:

Range方法用于生成指定范围的整数序列,在BS程序中,经常需要分页显示,在页面中需要显示页面号码的链接,用这个方法可以生成页码数组。

DemoRange生成从18到26的页码序列:

13.Repeat方法:

Repeat方法用于生成指定数量重复元素的序列:

DemoRepeat:生成含有5个相同类型元素的序列

14.Empty方法

Empty方法用于获取一个指定的类型参数的空序列。

DemoEmpty:生成String类型的空序列

15.DefaultIfEmpty方法

DefaultIfEmpty方法用于获取序列,如果序列为空则添加一个类型默认值的元素。例如,元素为引用类型,添加null值元素;元素为int类型,添加int的默认值为0.

DemoDefaultIfEmpty:检测多种类型序列是否为空:

DemoDefaultIfEmpty2:使用自定义默认值的DefaultIfEmpty方法

16.Cast方法

Cast方法用于按照 TResult类型转换IEnumerable序列的类型。

DemoCast:将ArrayList序列转换成泛型序列

 

17.OfType方法

OfType方法用于根据TResult类型筛选IEnumerable类型序列的元素。它的用途跟Cast方法类似,但OfType方法如果遇到不能强制转换为TResult类型的元素,会丢弃这个元素,而不会出现运行错误。

DemoOfType:使用OfType方法转换ArrayList序列转换成泛型序列:

上面给ArrayList添加了两个无法转换为String类型的元素,应用OfType方法后,将被抛弃。

18.AsEnumerable方法

AsEnumerable方法用与根据元素类型转换为泛型IEnumerable<T>序列。LINQ可以操作多种数据源,而数据源一般使用自己的序列类型,例如LINQ to SQL使用IQueryable<T>类型,IQueryable<T>类型的LINQ扩展方法不进行任何数据操作,它们只负责LINQ表达式拆解为表达式目录树,IEnumerable<T>序列上的一些操作方法,例如Reverse方法,Contains方法等不被IQueryable<T>类型支持,如果需要使用这些操作,就要用AsEnumerable方法,将IQueryable<T>类型转换为IEnumerable<T>类型。

DemoAsEnumerable:将IQueryable类型转换为IEnumerable类型

 

二  用于立即执行的Enumerable类方法成员

1.ToArray方法用于为序列创建一个数组

DemoToArray:将序列转换为数组:

2.ToList方法

ToList方法用于将序列 转换为泛型  List<T>

DemoToList:将序列 转换为泛型List<T>

后面还有很多,大家想学习的话,MSDN上有详细的介绍。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值