【极客营】LINQ进阶篇—LINQ To Object

系列课程视频地址:https://ke.qq.com/course/267924?flowToken=1006068

 

1、IEnumerable对象

在LINQ中,数据源和查询结果实际上都是IEnumerable和IQueryable类型的对象,可以通过调用对象的方法或者属性等,对数据源进行查询并使用查询结果数据,本篇介绍如何通过对象查询方法使用LINQ。

实际上,在LINQ查询表达式中可以使用的查询功能很少,在实际开发,通过对查询结果或数据源进行方法调用,从而进行更多的查询操作。在Net类库中,IEnumerable接口中提供了大量与查询相关的方法,这些方法实际上都是以扩展方法的形式定义,使用时和成员方法类似。

C#3.0扩展方法使你能够向现有类型添加方法(包括用户自定义的类型和对象),而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但是可以像扩展类型上的实例方法一样进行调用。对于用C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

IEnumerable接口常用成员表:

 

 成员

 功能

 Max

 计算序列中所有元素的最大值,返回值有intlongfloatdoubledecimal类型,并且可以指定元素到数值的映射方法

 All

 检查是否序列中所有元素都满足条件,可以指定条件判断方法。如果所有元素都满足条件返回True,否则返回False

 Any

 检查序列中是否有任何一个元素满足条件,可以指定条件的判断方法。如果有一个以上(含一个)元素满足条件返回True,否则返回False

 Contains 

 检查数据系列中是否包含特定的元素,可以指定相等比较方法

 First

 返回序列中满足指定条件的第一个元素,可以指定条件判断方法

 Single

 返回序列中满足指定条件的唯一元素。如果不止一个元素满足条件会引发一场,可以指定条件判断方法

Reverse

反转序列中元素的顺序 

 Distinct

返回序列中不重复的元素的集合,可以指定相等比较方法 

 Concat

连接两个序列,直接首尾相连。返回结果可能存在重复数据 

 Union

 获取两个元素集合的并集,可以指定相等比较方法

 Where

根据制定条件对集合中元素进行筛选,返回满足条件的元素集合 

 Skip

跳过序列中指定数量的元素,然后返回剩余的元素 

 Take

从序列的开头返回指定数量的连续元素 

 ToList

IEnumerable创建一个List 

文章最后附录了IEnumerable接口的所有成员表。


LINQ表达式在真正执行时都转化成具体的函数调用,所以要求在LINQ查询关键字和IEnumerable接口的方法之间有一个对应关系。

查询表达式和方法对应关系

IEnumerable的方法

查询表达式关键字

功能

Cast()

From子句指定元素类型

使用显示类型的范围变量

GroupBy()

Group…by

Group…by…into

对查询结果进行分组

GroupJoin

Join…in…on…equals…into

左外联接查询

Join()

Join…in…on…equals

内部联接查询

OrderBy()

orderby

从小到大排序

OrderByDescending

Orderby…descending

从大到小排序

Select()

select

指定影射元素(目录数据返回)

SelectMany()

select

从多个from子句进行查询

ThenBy()

Orderby…,…

多个排序元素,后一个排序元素按从小到大排序

ThenByDescending

Orderby…,…descending

多个排序元素,后一个排序元素按从大到小排序

Where()

where

条件过滤

在进行扩展方法调用之前,必须先学习一下Lambda表达式。

Lambda表达式实际上是一个匿名函数,它包含表达式语句,常用于创建委托或表达式目录树类型,所有的Lambda表达式都使用运算符”=>”,该运算符读为goes to,或者读取”推导出”。

语法:

(input parameters)=>expression

左边是输入参数,右边是表达式或语句块,Lambda表达式返回右边表达式的结果。

其中parameters是一个参数列表,只有一个参数时可以不用括号,如果有两个及以上参数时,必须用括号,并且每个参数在括号中用逗号分隔。

通常lambda表达式的参数都是可变类型的,由编译器自动确定它的具体类型,也可以指定参数类型。

当lambda表达式没有参数时,需要使用空的括号表示:

()=>TestMethod();

由Lambda表达式实际是匿名函数,它可以赋值到一个委托上也可以,Lambda表达式在LINQ中被广泛使用。

体验查询方法及Lambda表达式的体验应用:

public static void Main()

{

    int[] arr={2,4,5,8,9,11};

    //用扩展方法Where设置查询条件,参数为Lambda表达式

    varquery1=arr.Where(numer=>num%2==0);

     foreach(var val in query1)

    {

        System.Console.Write(“{0}”,val);

    }

}

2、用Where()方法进行筛选

在LINQ查询中,where子句可以用IEnumerable.Where()方法来实现,该方法接收一个Lambda表达式或者函数委托作为参数,该委托指定过滤的具体实现,返回符合条件的元素集合。包含两个版本的Where()方法。

□只对数据集合中的元素进行过滤,返回一个bool值,如果为true,则该元素被选择为结果,否则不被选择。

□同时对数据集合中的元素和索引进行过滤,将元素和元素索引分别作为第一个和第二个参数,并返回一个bool值,如果为true,则该元素被选择为结果,否则不被选择。

例题1:

【极客营】LINQ进阶篇—LINQ To Object_第1张图片

 

结果:

Query1:5 10 30 45

Query2:1 30 33 44 45

例题2:查找书名为《.NET高级程序设计》的元素。

创建一个Book类:

【极客营】LINQ进阶篇—LINQ To Object_第2张图片

 

普通方法的应用:

【极客营】LINQ进阶篇—LINQ To Object_第3张图片

 

LINQ查询方法Where()的应用:

            var items = books.Where(book => book.BookName.Equals(".NET高级程序设计"));

            foreach (Book item in items)

            {

                Console.WriteLine(item.BookName);

                Console.WriteLine(item.Author);

                Console.WriteLine(item.PublishYear);

                Console.WriteLine();

           }

查询关键字where应用

【极客营】LINQ进阶篇—LINQ To Object_第4张图片

 

3、用Skip()、SkipWhile()跳过元素

在实际的开发中,我们在查询时有时需要跳过某些元素,只提取剩下的元素作为查询结果,此时需要用到Ienumerable接口中的Skip(0和SkipWhile()两个方法。

Skip(count)方法只是简单的跳过集合中指定数量的元素,参数count指要跳过的元素数量,被跳过的元素从集合中第1个元素开始计数。

SkipWhile(lambda表达式)方法则跳过集合中指定条件的元素,从集合中第1个元素开始,使用lambda表达式进行计算,如果返回为true,则跳过并继续判断下一个元素,如果返回false,则停止判断,返回集合中没有被跳过的所有元素。

例题3:

【极客营】LINQ进阶篇—LINQ To Object_第5张图片

案例结果: query1:8 -13 -4 12 -19 20    query2:-13 -4 12 -19 20

上述案例中虽然intAry的第6个元素绝对值也小于10,但是由于第5个元素终止了SkipWhile()的循环判断,所以第5个及后面的元素都不会跳过

4、用Max() 等对元素进行数值运算

在传统的SQL查询语言中,还可以对集合中字段的数值运算操作,包括最大值、最小值、平均值等操作,在IEnumerable中也提供了相应的方法可以实现这些操作。

Min():计算集合中指定元素的最小值

Max():计算集合中指定元素的最大值

Sum():计算集合中指定元素的累加和

Average():计算集合中指定元素的平均值

这些方法都 包括13个重载版本。

例题4:

【极客营】LINQ进阶篇—LINQ To Object_第6张图片

注意:字符串的比较大小是按字母表的顺序进行比较的。

例题2:字符串中求最大值、最小值的效果,使用lambda表达式作为参数。

【极客营】LINQ进阶篇—LINQ To Object_第7张图片

注意:在实际开发中,可以按照某种特定规则将非数值类型数据映射到数值类型,然后使用Min()、Max()等操作获取最大值、最小值等,再根据返回值反推出该数据。

完整内容请移步至视频:https://ke.qq.com/course/267924

 

附:IEnumerable接口成员

 成员

 功能

 Aggregate

 对序列应用累加器函数,可以指定累加方法

 Sum

 计算序列中所有元素的和,返回值有intlongfloatdoubledecimal类型,并且可以指定元素到数值的映射方法

 Average

 计算序列中所有元素的平均值,返回值有intlongfloatdoubledecimal类型,并且可以指定元素到数值的映射方法

 Max

 计算序列中所有元素的最大值,返回值有intlongfloatdoubledecimal类型,并且可以指定元素到数值的映射方法

 Min

 计算序列中所有元素的最小值,返回值有intlongfloatdoubledecimal类型,并且可以指定元素到数值的映射方法

 All

 检查是否序列中所有元素都满足条件,可以指定条件判断方法。如果所有元素都满足条件返回True,否则返回False

 Any

 检查序列中是否有任何一个元素满足条件,可以指定条件的判断方法。如果有一个以上(含一个)元素满足条件返回True,否则返回False

 Contains

 检查数据系列中是否包含特定的元素,可以指定相等比较方法

 Count

 返回序列中满足指定条件的元素的数量,可以指定条件判断方法

 LongCount

 返回序列中满足指定条件的元素的长数量,可以指定条件判断方法

 Cast

 IEnumerable中的元素转换为指定的数据类型

 DefaultIfEmpty

 返回序列中指定位置的元素。如果序列为空,则返回默认的元素值

 ElementAt

 返回序列中指定索引处的元素

 ElementAtOrDefault

 返回序列中指定索引处的元素。如果序列为空,则返回默认值

 First

 返回序列中满足指定条件的第一个元素,可以指定条件判断方法

 FirstOrDefault

 返回序列中满足指定条件的第一个元素。如果不存在则返回默认值,也可以指定条件判断方法

 Last

 返回序列中满足指定条件的最后一个元素,可以指定条件判断方法

 LastOrDefault

 返回序列中满足指定条件的最后一个元素。如果不存在则返回默认值,也可以指定条件判断方法

 Single

 返回序列中满足指定条件的唯一元素。如果不止一个元素满足条件会引发一场,可以指定条件判断方法

 SingleOrDefault

返回序列中满足指定条件的唯一元素。如果不存在则返回默认值,如果不止一个元素满足条件会引发一场,可以指定条件判断方法 

Reverse

反转序列中元素的顺序 

 Distinct

返回序列中不重复的元素的集合,可以指定相等比较方法 

 Concat

连接两个序列,直接首尾相连。返回结果可能存在重复数据 

 Except

获取两个元素集合的差集,可以指定相等比较方法 

 Intersect

 获取两个元素集合的交集,可以指定相等比较方法

 Union

 获取两个元素集合的并集,可以指定相等比较方法

 SequenceEqual

比较两个序列是否相等,可以指定相等比较方法 

 Where

根据制定条件对集合中元素进行筛选,返回满足条件的元素集合 

 Skip

跳过序列中指定数量的元素,然后返回剩余的元素 

 SkipWhile

跳过序列中满足指定条件的元素,然后返回剩余的元素,可以指定条件判断方法 

 Take

从序列的开头返回指定数量的连续元素 

 TakeWhile

返回从序列开始的满足指定条件的连续元素,可以指定条件判断方法 

 ToArray

IEnumerable创建一个数组 

 ToList

IEnumerable创建一个List 

完整内容请移步至视频:https://ke.qq.com/course/267924?flowToken=1006068

 

 

你可能感兴趣的:(.net)