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 ...
随机推荐
- 2019 GDUT Rating Contest I : Problem H. Mixing Milk
题面: H. Mixing Milk Input file: standard input Output file: standard output Time limit: 1 second Memory ...
- java实现一个点餐系统
转载于blog.csdn.net/weixin_44219955 项目大体框架 菜品类(菜品id,菜品名,菜品类型,上架时间,单价,月销售,总数量) 管理员类(管理员id,账号,密码) 客户类(客户i ...
- Java学习之this关键字的使用
•区分成员变量和局部变量 public class Person { String name; int age; public void set(String name,int age) { this ...
- C++中的间接宏函数
宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义.使用宏函数. 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #define CONVERT ...
- [2020年10月28日普级组]1406.SMRTFUN
S M R T F U N SMRTFUN SMRTFUN 题目描述 "又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣--" 这些牛想要证明,他们是既有趣,又聪明的.为了这样 ...
- 定制开发——GitHub 热点速览 v.21.15
作者:HelloGitHub-小鱼干 自定义 或者说 定制 是本周 GitHub 热点的最佳写照.比如,lipgloss 这个项目,可以让你自己定义终端样式,五彩斑斓的黑终端来一个.接着,是 Appl ...
- SSH 教程 ——阮一峰
SSH 教程 --阮一峰 文章出处 SSH 基本知识 SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制.实务中,它主要用于保证远程登录和 ...
- 【NCRE】常见的网络入侵与攻击的基本方法
本节内容来自<全国计算机等级考试三级教程--网络教程>2020版 实训任务五. 因为一直记不住几个常见的DOS攻击,这里记录一下,顺便找个好方法记住.跟CTF关联以后这部分知识确实感触颇深 ...
- math random模块
math --- 数学函数 该模块提供了对C标准定义的数学函数的访问,返回值除非有明确说明,否则所有返回值均为浮点数 math.ceil(x) 返回 x 的上限,即大于或者等于 x 的最小整数. 如果 ...
- .Net之配置文件
1. 说明 默认情况下读取配置Configuration的默认优先级:ConfigureAppConfiguration(自定义读取)>CommandLine(命令行参数)>Environ ...