LINQ之方法语法
上节讲到使用linq的查询关键字进行查询,这节讲一下linq查询的另一种方式——linq方法。
使用linq方法语法,必须要会用lambda表达式,配合lambda表达式才能体会到linq的优雅便捷。
linq方法是一系列的扩展方法,对于实现了IEnumerable接口的对象,都可以使用,扩展方法在VS智能提示中显示为一个正方体加一个向下的虚箭头。
对于上节的代码,使用方法语法则可以简洁为一行:
int[] vs = { 1, 6, 3, 2, 5 };
var a = vs.Where(v => v > 3);
foreach (var t in a)
{
Console.Write(t);
}
运行结果为:65
使用方法语法的好处是可以直接在原数据后操作,可以使用链式编程实现复杂的查询操作。但是一些情况下查询语法更好用,这个要看开发的需求以及个人喜好。
下面介绍一些常用的linq方法(以下例子基于上述vs数组):
Select
linq方法基本上都要配合lambda表达式,因为linq方法的参数一般都是一个委托,而lambda表达式在填充委托方面有着优雅的特性(不熟悉lambda表达式用法的同学可以回顾往期文章:浅析C#中的Lambda表达式),表达式参数即是每个遍历到的数据。Select()方法用于隐式迭代所有的数据,可以在迭代中对每个数据进行处理:
var a = vs.Select(v => ++v);//将所有数据加一并返回
SelectMany()方法用于返回多行结果,它可以在方法中嵌套查询。
Skip,Take
Skip(int i)方法用于跳过前i个元素,相反的,Take(int i)方法用于获取前i个元素
var a = vs.Skip(2);//运行结果:325
var a = vs.Take(2);//运行结果:16
SkipWhile()和TakeWhile()用于满足条件即停止执行,前者返回剩下的元素,后者返回匹配到的元素,个人觉得这两个方法执行逻辑很绕,有兴趣的可以自己写代码看看效果。
SkipLast(int i)和TaskLast(int i)用于跳过和获取最后的元素。
Concat
concat(IEnumerator<T>)用于将参数拼接在原数据的后面。
var a = vs.Concat(new List<int>(){7,9,8});//运行结果16325798
Contains
Contains(T t)用于指定其参数是否包含在该数据源中。
var a = vs.Contains(2);//true
它还有一个重载方法 Contains(T t,IEqualityComparer<T> e),第二个参数用于自定义比较的规则,因为有的时候系统的直接比较法不是我们想要的,所以就需要我们自定义比较规则,这个可以展开来解释一下:它的第二个参数是一个接口,接口里边定义了一个Equals()方法,我们需要自定义一个类实现这个接口,请看代码:
public class MyClass : IEqualityComparer<int>
{
public bool Equals(int x, int y){
y = y - 2;
return x == y;
}
//该方法是此接口的另一个方法,与当前上下文无关,此处不做说明
public int GetHashCode(int obj){
throw new NotImplementedException();
}
} var a = vs.Contains(2, new MyClass());//false
x就是Contains()的第一个参数,y是迭代数据源中的每一个数据,我现在将比较规则改为比较x是否等于y-2,相当于说让比较2是否包含在{-1, 4, 1, 0, 3}中,显然,结果为false。
一般情况下,自定义规则用在比较自定义对象数组或集合中。
OrderBy
OrderBy()用于排序,根据lambda表达式的返回值进行升序排序,它有一个重载,用于自定义排序规则,用法跟Contains()类似。
var a = vs.OrderBy(c => c);//运行结果 12356
下面我使用它的重载降序排序数据
public class MyClass : IEqualityComparer<int>, IComparer<int>
{
public int Compare(int x, int y){
return -(x - y);
}
}
再次调用后结果为降序:
var a = vs.OrderBy(c => c,new MyClass());//运行结果65321
其它
下面简洁介绍一下另一些常用的方法(了解更多linq方法请查阅相关文档):
bool All(), bool Any() |
前者所有元素满足即为true,后者至少一个满足即为true |
int Count(), long LongCount() |
两者都是计数,并且可以统计满足条件元素个数,只是返回值不同 |
T Max(), T Min() |
返回最大最小值,可以自定义排序规则(凡是涉及到比较或排序的,都可以自定义规则) |
double Sum() | 求和 |
T ElementAt(), T ElementAtOrDefault() |
获取指定位置上的元素,后者对于访问出错的情况下返回可以将设置的默认值返回 |
这是我的公众号二维码,获取最新文章,请关注此号
LINQ之方法语法的更多相关文章
- .NET LINQ查询语法与方法语法
LINQ 查询语法与方法语法 通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...
- LINQ之路 4:LINQ方法语法
书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方 ...
- C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法
连载目录 [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...
- 四:MVC之LINQ方法语法
linq 查询 有两种语法 ,前面我们说了一种,接下来说方法语法(我读着一直很绕口) 查询语法,方法语法 ------------------------以下文字都是复制-------------- ...
- Linq学习(主要参考linq之路)----2LINQ方法语法
方法语法:Fluent Syntax 方法语法是非常灵活和重要的.我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询. eg1: st ...
- FreeSql (二十四)Linq To Sql 语法使用介绍
原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...
- linq介绍及工作中应用两例——左联与内联,linq循环方法
目录 1 linq介绍 1.1 linq产生背景 1.2 linq使用范围 1.3 linq核心程序集 1.4 linq架构图 1.5 linq使用形式对比 1.5.1 linq To Objects ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题
//重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...
随机推荐
- IntelliJ IDEA安装lombok
1. 搜索Plugins 点击下方的Browse repositories.. 2.点击安装,重新启动
- (一)SpringBoot启动过程的分析-启动流程概览
-- 以下内容均基于2.1.8.RELEASE版本 通过粗粒度的分析SpringBoot启动过程中执行的主要操作,可以很容易划分它的大流程,每个流程只关注重要操作为后续深入学习建立一个大纲. 官方示例 ...
- Async Cow Python 七牛异步SDK
# Async Cow Python 七牛异步SDK > gitee链接 >github链接本SDK基于官方SDK改造而成,但又对其进行了进一步封装,简化了相关操作例如:- 1.不需要使用 ...
- PureStudy:学科知识分享——个人网站开发全解
PureStudy:学科知识分享--个人网站开发全解 项目描述 PureStudy,学科知识分享网站. 学生可以使用这个网站,来浏览相应学科的知识点.学习总结,获取相关的资料.此外,他们可以选择上传文 ...
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控
Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...
- rpm 命令介绍
1. rpm 命令常用选项说明 1.1 功能模式选项 命令 解释 -i --install 安装软件,例:rpm -ivh tree-1.6.0-10.el7.x86_64.rpm -U --upgr ...
- [hash-bfs]USACO 3.2 Magic Squares 魔板
魔 板 魔板 魔板 题目描述 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...
- java.net.BindException: Problem binding to [hadoop103:8031] java.net.BindException
ResourceManger启动失败,Namenode启动成功,这个问题排查了好久 在hadoop-2.7.6/logs/yarn-root-resourcemanager-hadoop102.log ...
- vs2019新建数据库后插入中文变问号
在使用VS创建了数据库后如果直接给字符类型插入中文内容的话查询结果插入的中文会以"?"的格式展现. 原因是因为默认创建的数据库的排序类型为拉丁文不支持中文. 所以需要讲这个排序的字 ...
- leetcode 刷题(数组篇)11题 盛最多水的容器(双指针)
题目描述 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) .找出其 ...