方法语法:Fluent Syntax

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

  eg1:

static void Main(string[] args)
{
string[] names={"Tom","Jerry","Harry"};
IEnumerable<string> query=names
.Where(n=>n.Contains("a"))
.OrderBy(n=>n.Length)
.Select(n=>n.ToUpper()); foreach(string name in query)
Console.WriteLine(name); }

当链接使用查询运算符时,一个运算符的输出sequence会成为下一个运算符输入的sequence,其结果形成了一个sequence的传输链,如图:

上例中,Where产生一个经过过滤的sequence;OrderBy生成输入sequence的排序版本;Select得到的序列中的每个元素都经过了给定lambda表达式的转换。

  其中Where,OrderBy,Select这几个扩展方法的签名(其中predicate/Func/Action参考 predicate/Func/Action泛型委托 ):

public static IEnumerable<TSource> Where<TSource>
(this IEnumerable<TSource> source,Func<TSource,bool> predicate) public static IEnumerable<TSource> OrderBy<TSource,TKey>
(this IEnumerable<TSource> source,Func<TSource,Key>keySelector) public static IEnumerable<TResult> Select<TSource,TResult>
(this IEnumerable<TSource> source,Func<TSource,TResult> selector)

 其他的查询运算符:

  并不是所有的查询运算符都返回一个sequence.

  元素运算符会从输入sequence中获取单个元素,如:First,Last和ElementAt;

int[] numbers={,,,,};
int firstNumber=numbers.First();
int lastNumber=numbers.Last();
int secondNumber=numbers.ElementAt();
int lowestNumber=numbers.OrderBy(n=>n).First();

  集合(aggregation)运算符返回一个标量值,通常是数值类型:

int count=numbers.Count();
int min=numbers.Min();

  判断运算符返回一个bool值:

bool hasTheNumberNine=numbers.Contains();
bool hasElements=numbers.Any();
bool hasAnOddElement=numbers.any(n=>(n%)==);

  因为这些运算符并不是返回一个sequence,所以我们不能再这些运算符之后链接其他运算符。也就是说,他们一般出现在查询的最后面。

  还有的接受两个输入sequence,比如Concat把一个sequence添加到另外一个seqence后面;Union与Concat类似,但是会去除相同的元素:

  

int[] seq1={,,,};
int[] seq2={,,};
IEnumerable<int> concat=seq1.Concat(seq2); //{1,2,2,3,3,4,5}
IEnumerable<int> union=seq1.Union(seq2); //{1,2,3,4,5}

Linq学习(主要参考linq之路)----2LINQ方法语法的更多相关文章

  1. Linq学习之旅——LINQ查询表达式

    1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 ...

  2. Linq学习<五> 运用linq查询Xml

    这节将学习如何用 linq查询xml 一.我们先看看在xml中我们怎么操作 public void xmlWayToQueryXmlFile() { XmlDocument xmldoc = new ...

  3. Linq学习(一)-初涉Linq

    一.何谓LINQ LINQ:Language Integrated Query语言集成查询,其本质是对ADO.NET结果集通过反射连同泛型特性转换成对象集,实现OR模型的转换 二.优点与缺点 优点:封 ...

  4. LINQ学习笔记——(1)添加扩展方法

    目的:  对已存在类型的行为进行扩展 注意事项:    扩展方法是一种特殊的静态方法    扩展方法必须在静态类中定义    扩展方法的优先级低于同名的类方法    扩展方法只在特定的命名空间内有效 ...

  5. C# LINQ学习笔记一:走进LINQ的世界

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介:     语言集成查询(LINQ)是Vi ...

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

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

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

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

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

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

  9. LINQ 学习笔记(1)

    学习资源参考 : http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 常用方法是 Where, OrderBy, Selec ...

随机推荐

  1. SpringBoot_02_servlet容器配置

    二.参考资料 1.Spring boot 自定义端口 2.Spring Boot的Web配置(九):Tomcat配置和Tomcat替换

  2. Spring_Aop的xml和注解的使用

    动态代理:    目的:在不改变源代码的情况下,对方法进行增强!        动态代理又分为两种:    1.第一个就是基于接口的动态代理,他是由jdk提供的    2.基于子类的动态代理:cgli ...

  3. C#语言和SQL Server第十三 十四章笔记

    十三章  使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章:                                                       ...

  4. DevOps/TestOps概念

    天下大势分久必合合久必分,早期的软件开发只有软件工程师一人完成,为了提高效率逐渐实行分工模式:开发.测试.运维.不同角色担任不同的任务.分工越来越细之后带来了问题也越来越突出,那就是各角色之间的沟通成 ...

  5. Python 开发个人微信号在运维开发中的使用

    一.主题:Python 开发个人微信号在运维开发中的使用 二.内容: 企业公众号 介绍开发微信公众号的后台逻辑,包括服务器验证逻辑.用户认证逻辑 个人微信号 面对企业微信的种种限制,可以使用 Itch ...

  6. TSLint提示错误

    要成为优秀的TS开发人员,必须直接禁用TS的不良特性. 为此,道爷亲自操刀编写了TSLint工具,用来分析我们的TS代码,把潜在的Bug和不良代码全部找出来. 目的是为了保证TS的质量,但是存在的问题 ...

  7. 建造者模式(Builder)-宏观的使用角度

    建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...

  8. Java框架之Hibernate(一)

    一.Hibernate - 核心接口 它是  JBoss Community team (社区团队) 开发的.Hibernate 是一个开源的,对象关系模型框架 (ORM),它对JDBC进行了轻量的封 ...

  9. Unity3d 协程

    参考文章: http://blog.csdn.net/onafioo/article/details/48979939 http://www.cnblogs.com/zhaoqingqing/p/37 ...

  10. 【读书笔记】【深入理解ES6】#4-扩展对象的功能性

    对象类别 ES6规范清晰定义了每一个类别的对象. 普通(Ordinary)对象 具有JS对象所有的默认内部行为 特异(Exotic)对象 具有某些与默认行为不符的内部行为 标准(Standard)对象 ...