【极客营】LINQ进阶篇—LINQ To Object
系列课程视频地址: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相关推荐
- “StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!
操作系统.编译器.数据库是软件工程师的梦之所向,对于大多数人而言,却是近在眼前.远在天边: 你是否曾渴望加入 Linux 这样伟大的社区,然觉门槛太高无从下手? 你是否也曾想象参与开发 MySQL 这 ...
- All Eyes on Docs! 练就火眼金睛,就来StarRocks 极客营
开放源代码运动的主要领导者--埃里克·雷蒙(Eric Steven Raymond)在他出版的<大教堂与集市>中描述了这样一个精彩的观点:只要有足够多的眼球关注,就可让所有软件缺陷浮现.他 ...
- 牛客网SQL 进阶篇刷题
牛客网SQL 进阶篇刷题(1-19) 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分: 用户1002在2021年9月4日上午7点1分2秒开始 ...
- StarRocks极客营 | 90天,17名新晋贡献者,SQL Planner 实战回顾
若能体验一个字符串的 SQL 怎么一步步在 StarRocks 被执行起来,对于 OLAP 开发者来说,能大大帮助理解整个框架和系统流程. 近日,由 StarRocks 社区举办的 SQL Plann ...
- Linux极客命令(压缩篇)
1.*.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注意:tar是打包,不是压缩! 2.*.tar.gz 和 *.tgz 解 ...
- 【深度思考,极客大学Java进阶训练营
1.3 将long转换为Instant 1)根据秒数时间戳转换: Instant instant = Instant.now(); System.out.println(instant);long e ...
- python进阶训练营极客大学_极客大学go进阶训练营
一.第一个go程序  package main import ( "fmt" ) func main(){ fmt.Println("hello world" ...
- 【极客时间】《Java并发编程实战》学习笔记
目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...
- Linq初级班 Linq To XML体验(基础篇)
LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...
- 极客HTTP协议学习笔记破冰篇(1-7)
极客HTTP协议学习笔记破冰篇(1-7) 前言 各篇章笔记链接 一.学习笔记 1.HTTP的前世今生 2.HTTP是什么 3.与HTTP相关的各种概念(上) 4.与HTTP相关的各种概念(下) 5.常 ...
最新文章
- Linux command: ps -ef |grep java
- 三个小命令检查电脑!
- 1.15 Java冒泡排序法
- Codeforces Round #394 (Div. 2) A. Dasha and Stairs 水题
- centos minimal 安装无法自定义分区
- apache php日志配置,如何设置apache每天保存日志
- 洛谷 题解 P2312 【解方程】
- vscode 推荐premiter_自用VSCode优质插件推荐
- 随想录(提高代码质量的几个工具)
- The Falling Leaves UVA - 699
- 一个JAVA WEB伪全栈的VUE入坑随笔,从零点零五学起
- Oracle 向上递归、向下递归
- Java中普通代码块,构造代码块,静态代码块执行顺序
- 一次 注册dll失败 的经历
- Kali系统学习:弱点扫描工具NMAP实战演示
- 方剂学(综合练习)题库【1】
- 如何在计算机上设置网络打印机,在 Windows XP 中如何设置共享打印机(下)
- w7计算机虚拟内存设置,win7虚拟内存怎么设置最好
- 格物 致知 诚意 正心 修身 齐家 治国 平天下
- 极值点、驻点、拐点、关系点