从匿名方法到 Lambda 表达式的推演过程
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 以上是msdn官网对Lambda 表达式的描述。实质上Lambda 表达式可以说是从匿名方法推演而来,微软程序员为了提高我们广大程序员的生产效率推出了Lambda 表达式,它的出现无疑是极具影响力的。
Lambda 表达式使用Lambda 运算符=>,我们一般读作“goes to”,当然这并不是说它跟C#中的goto有相同的含义,只是都有“转到”的意思罢了。Lambda 表达式的书写规则如下:
参数列表=>表达式
现在就让我来讲解下从匿名方法到Lambda 表达式的推演过程。以上篇博文的例子为例,
- //假设需要从list集合中获取大于3的所有元素以新集合返回
- List<int> list = new List<int>() { , , , , , };
- var newlist = list.FindAll(delegate(int i) { return i > ; });
这是用匿名方法实现的写法。微软程序员觉得这样子不够简单,为了简便写法,便有了如下的推断过程。
首先既然你总是要传入一个匿名方法,总是会有delegate这个关键字,于是可以考虑将delegate去掉。去掉了delegate,那么书写就不规范了,于是就引入了=>运算符用来连接参数列表与表达式,这样上式便变成:
- var newlist = list.FindAll((int i) => { return i > ; });
其次,int这个类型是可以推断出来的,当用鼠标指到"FindAll"的时候就可以看到:
,
这便让我们知道这里delegate后续的入参是int型(本例是int型,因为上面的集合是int型,实际上什么类型是看你自己需求的),于是再指定类型为int显得有点多余,因此可以写成这样:
- var newlist = list.FindAll((i) => { return i > ; });
而此时参数只有一个,因此括号也可以去掉:
- var newlist = list.FindAll(i => { return i > ; });
然后,FindAll()需要传入一个Predicate<T>泛型委托,可以按F12看出该委托返回值类型为bool,同样我们传入的匿名方法必须与它具有相同的签名,所以也要返回bool值。因为总是知道要返回什么类型的值,所以可以考虑去掉return关键字,而方法体里只有一句表达式,所以可以考虑去掉大括号,同时也将表达式后面多余的分号去掉,到了这个时候原本的方法体已变成i>3这么个表达式,其等价于一个bool值,可以类比if(i>3)来理解,多个return关键字不过是为了返回值以符合方法定义的规范。于是原来的式子又演变成了:
- var newlist = list.FindAll(i => i > );
这就是Lambda 表达式。
看了上面的例子或许有人会有这样的疑惑,=>右边就只能写一句表达式,那么如果我要执行很复杂的逻辑怎么办?事实上,可以这样写:
- List<int> newlist = list.FindAll( (int i) =>//小括号和int可以同时省略,也可以只省略int,不能只省略小括号留int
- {
- //这里可以写复杂的逻辑,下面只是示例,当然可以直接return i>3;效果和上面的一样
- Console.WriteLine("原集合有如下数字:{0}", i);
- bool b = i > ;
- return b;
- });
之前的例子是因为 =>左边的参数只有一个才可以省略小括号,实际上,当参数不止一个的时候,则不能省略小括号,例如:(i,j)=>表达式或语句块
如果没有参数,可以这样写:()=>表达式或语句块
从匿名方法到Lambda 表达式可以说一个优化演变的过程,Lambda 表达式是一个委托类型,它和匿名方法一样可以传递为委托参数。
从匿名方法到 Lambda 表达式的推演过程的更多相关文章
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- 委托、匿名方法、Lambda表达式的演进
摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...
- 匿名方法,Lambda表达式,高阶函数
原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...
- Fun<>,匿名方法,Lambda表达式 冒泡排序C#
大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 进阶系列(8)——匿名方法与lambda表达式
一 匿名方法的介绍 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础.在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建 ...
随机推荐
- [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能
很久没有更新博客了,再不写点东西都烂了. 这次更新一个小内容,是两个插件的组合使用,实现头像上传功能. 业务需求: 头像上传功能,要对上传的文件进行剪切,且保证头像到服务器时必须是正方形的. 优化&l ...
- SQLite
什么是SQLite SQLite是一款轻型的嵌入式数据库 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快 ...
- js parsefloat
项目中需要对返回的小数进行格式化,把零省略掉. 1.00 ---> 1 1.01 ---> 1.01 1.10 ---> 1.1 parseFloat() 函数可解析一个 ...
- Nginx笔记
基础篇 关于Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.最早由俄罗斯的程序设计师Igor Sysoev所开发,并在一个BSD-like ...
- 关于entityframework 自动生成实体类中加验证的属性重新生成后属性被覆盖解决办法
1.手动创建一个部分类 (你可以手动创建 partial class, 内容为空) [MetadataType(typeof(AppleMetadata))] public partial class ...
- [Java] JSP笔记 - EL、JSTL 常用标签
一. 什么是 EL 语言 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语言. 二.EL 语言的作用 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMASc ...
- mysql-proxy 读写分离
mysql-proxy 读写分离 主从复制 MySQL Replication可以将master的数据复制分布到多个slave上,然后利用slave来分担master的读压力. 读写分离 MySQL- ...
- Python之路【第二十四篇】Python算法排序一
什么是算法 1.什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果. ...
- Node.js之路【第三篇】NodeJS异步实现
NodeJS异步实现 Node.js异步编程的直接体现就是回调,它依托于回调来实现,但不能说使用了回调他就是异步了 回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有的API都 ...
- 9Spring进阶----青软S2SH(笔记)