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

1、IEnumerable<T>对象

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

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

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

IEnumerable<T>接口常用成员表:

成员

功能

Max

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

All

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

Any

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

Contains

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

First

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

Single

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

Reverse

反转序列中元素的顺序

Distinct

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

Concat

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

Union

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

Where

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

Skip

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

Take

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

ToList

从IEnumerable<T>创建一个List<T>

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

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

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

IEnumerable<T>的方法

查询表达式关键字

功能

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<T>.Where()方法来实现,该方法接收一个Lambda表达式或者函数委托作为参数,该委托指定过滤的具体实现,返回符合条件的元素集合。包含两个版本的Where()方法。

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

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

例题1:

结果:

Query1:5 10 30 45

Query2:1 30 33 44 45

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

创建一个Book类:

普通方法的应用:

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应用

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

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

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

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

例题3:

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

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

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

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

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

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

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

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

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

例题4:

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

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

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

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

附:IEnumerable<T>接口成员

成员

功能

Aggregate

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

Sum

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

Average

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

Max

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

Min

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

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<T>创建一个数组

ToList

从IEnumerable<T>创建一个List<T>

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

【极客营】LINQ进阶篇—LINQ To Object相关推荐

  1. “StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

    操作系统.编译器.数据库是软件工程师的梦之所向,对于大多数人而言,却是近在眼前.远在天边: 你是否曾渴望加入 Linux 这样伟大的社区,然觉门槛太高无从下手? 你是否也曾想象参与开发 MySQL 这 ...

  2. All Eyes on Docs! 练就火眼金睛,就来StarRocks 极客营

    开放源代码运动的主要领导者--埃里克·雷蒙(Eric Steven Raymond)在他出版的<大教堂与集市>中描述了这样一个精彩的观点:只要有足够多的眼球关注,就可让所有软件缺陷浮现.他 ...

  3. 牛客网SQL 进阶篇刷题

    牛客网SQL 进阶篇刷题(1-19) 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分: 用户1002在2021年9月4日上午7点1分2秒开始 ...

  4. StarRocks极客营 | 90天,17名新晋贡献者,SQL Planner 实战回顾

    若能体验一个字符串的 SQL 怎么一步步在 StarRocks 被执行起来,对于 OLAP 开发者来说,能大大帮助理解整个框架和系统流程. 近日,由 StarRocks 社区举办的 SQL Plann ...

  5. Linux极客命令(压缩篇)

    1.*.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注意:tar是打包,不是压缩! 2.*.tar.gz 和 *.tgz 解 ...

  6. 【深度思考,极客大学Java进阶训练营

    1.3 将long转换为Instant 1)根据秒数时间戳转换: Instant instant = Instant.now(); System.out.println(instant);long e ...

  7. python进阶训练营极客大学_极客大学go进阶训练营

    一.第一个go程序  package main import ( "fmt" ) func main(){ fmt.Println("hello world" ...

  8. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  9. Linq初级班 Linq To XML体验(基础篇)

    LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...

  10. 极客HTTP协议学习笔记破冰篇(1-7)

    极客HTTP协议学习笔记破冰篇(1-7) 前言 各篇章笔记链接 一.学习笔记 1.HTTP的前世今生 2.HTTP是什么 3.与HTTP相关的各种概念(上) 4.与HTTP相关的各种概念(下) 5.常 ...

最新文章

  1. Linux command: ps -ef |grep java
  2. 三个小命令检查电脑!
  3. 1.15 Java冒泡排序法
  4. Codeforces Round #394 (Div. 2) A. Dasha and Stairs 水题
  5. centos minimal 安装无法自定义分区
  6. apache php日志配置,如何设置apache每天保存日志
  7. 洛谷 题解 P2312 【解方程】
  8. vscode 推荐premiter_自用VSCode优质插件推荐
  9. 随想录(提高代码质量的几个工具)
  10. The Falling Leaves UVA - 699
  11. 一个JAVA WEB伪全栈的VUE入坑随笔,从零点零五学起
  12. Oracle 向上递归、向下递归
  13. Java中普通代码块,构造代码块,静态代码块执行顺序
  14. 一次 注册dll失败 的经历
  15. Kali系统学习:弱点扫描工具NMAP实战演示
  16. 方剂学(综合练习)题库【1】
  17. 如何在计算机上设置网络打印机,在 Windows XP 中如何设置共享打印机(下)
  18. w7计算机虚拟内存设置,win7虚拟内存怎么设置最好
  19. 格物 致知 诚意 正心 修身 齐家 治国 平天下
  20. 极值点、驻点、拐点、关系点

热门文章

  1. 网站服务器和主机,服务器和主机对网站排名有什么影响? - 立金哥
  2. 2016ACM/ICPC亚洲区沈阳站---题解
  3. html+css 课工场首页
  4. 蜣螂优化算法(matlab代码实现)
  5. js的原型和原型链 (什么是原型和原型链)
  6. Prometheus监控学习之路(四)
  7. 程序员的12个层次与德雷福斯模型
  8. 自定义无限高精度定时器
  9. 电商助力产业扶贫,贫困农户实现“造血”新生
  10. android模拟器如何切换输入法