上节讲到使用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. ArrayList 、Vector 和 LinkedList 有什么区别?

    ArrayList.Vector .LinkedList 类均在java.util 包中,均为可伸缩数组,即可以动态改变长度的数组. ArrayList 和 Vector 都是基于存储元素的 Obje ...

  2. mysql最经典的语句

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  3. python常见的错误异常

    1.AssertionError 该异常在assert()语句运行失败时输出 2.AttributeError 该异常在参考或设置属性失败时输出 eg:class Gs: pass g = Gs() ...

  4. Java系列教程-SpringMVC教程

    SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...

  5. C# yield return 原理探究

    天需要些一个小工具,需要使用到多线程读写程序集,接口方法返回值类型需要为"IEnumerable<string>"这里用到了"yield return&quo ...

  6. 去空格的四则运算表达式求值-Java

    笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...

  7. 什么是 Ansible - 使用 Ansible 进行配置管理

    [注]本文译自:https://www.edureka.co/blog/what-is-ansible/   Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...

  8. 「Unity卡牌自走棋」项目NABCD分析

    项目 内容 这个作业属于哪个课程 2021学年春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 在这个课程的目标是 锻炼在大规模开发中的团队协作能力 这个作业在哪个具体方 ...

  9. (四)Struts2的Action(深入讲解版)

    Struts2的Action 开发者需要提供大量的Action,并在struts.xml中配置Action.Action类里包含了对用户请求的处理逻辑,因为我们也称Action为业务控制器. 一.编写 ...

  10. spring-cloud-oauth2 认证授权

    什么是OAuth2? OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在限定时间. ...