上节讲到使用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之方法语法的更多相关文章

  1. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

  2. LINQ之路 4:LINQ方法语法

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方 ...

  3. C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法

    连载目录    [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...

  4. 四:MVC之LINQ方法语法

    linq 查询 有两种语法  ,前面我们说了一种,接下来说方法语法(我读着一直很绕口) 查询语法,方法语法 ------------------------以下文字都是复制-------------- ...

  5. Linq学习(主要参考linq之路)----2LINQ方法语法

    方法语法:Fluent Syntax 方法语法是非常灵活和重要的.我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询. eg1: st ...

  6. FreeSql (二十四)Linq To Sql 语法使用介绍

    原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...

  7. 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 ...

  8. Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  9. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...

随机推荐

  1. 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 ...

  2. java实现一个点餐系统

    转载于blog.csdn.net/weixin_44219955 项目大体框架 菜品类(菜品id,菜品名,菜品类型,上架时间,单价,月销售,总数量) 管理员类(管理员id,账号,密码) 客户类(客户i ...

  3. Java学习之this关键字的使用

    •区分成员变量和局部变量 public class Person { String name; int age; public void set(String name,int age) { this ...

  4. C++中的间接宏函数

    宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义.使用宏函数.   但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #define CONVERT ...

  5. [2020年10月28日普级组]1406.SMRTFUN

    S M R T F U N SMRTFUN SMRTFUN 题目描述 "又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣--" 这些牛想要证明,他们是既有趣,又聪明的.为了这样 ...

  6. 定制开发——GitHub 热点速览 v.21.15

    作者:HelloGitHub-小鱼干 自定义 或者说 定制 是本周 GitHub 热点的最佳写照.比如,lipgloss 这个项目,可以让你自己定义终端样式,五彩斑斓的黑终端来一个.接着,是 Appl ...

  7. SSH 教程 ——阮一峰

    SSH 教程 --阮一峰 文章出处 SSH 基本知识 SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制.实务中,它主要用于保证远程登录和 ...

  8. 【NCRE】常见的网络入侵与攻击的基本方法

    本节内容来自<全国计算机等级考试三级教程--网络教程>2020版 实训任务五. 因为一直记不住几个常见的DOS攻击,这里记录一下,顺便找个好方法记住.跟CTF关联以后这部分知识确实感触颇深 ...

  9. math random模块

    math --- 数学函数 该模块提供了对C标准定义的数学函数的访问,返回值除非有明确说明,否则所有返回值均为浮点数 math.ceil(x) 返回 x 的上限,即大于或者等于 x 的最小整数. 如果 ...

  10. .Net之配置文件

    1. 说明 默认情况下读取配置Configuration的默认优先级:ConfigureAppConfiguration(自定义读取)>CommandLine(命令行参数)>Environ ...