从匿名方法到 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表达式的基础.在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建 ...
随机推荐
- Linux 文件压缩与归档
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- Linux下介绍一款不错的HTML编辑器
编写HTML文档需要编辑器,在windows平台上我们可以用NotePad++,下面介绍一款Linux下的编辑器Komodo Edit,这是一款免费,开源的编辑器. 他对HTML的支持有其独到之处,我 ...
- 换肤系统(oocss方式)
近期想做一个换肤系统,参考过Bootstrap系统,思前想后,内容不难,但就是理不清楚,主要是换肤系统的css如何设计,怎样设计可重用性最好,后期更方便修改和维护,还有一个最头疼的就是怎么给css进行 ...
- 前端js书写规范和维护方案
在网上看到一篇文章,写的是怎样来维护自己写的js.感觉挺不错的,感觉代码很漂亮,转之,代码如下: /** * Created by gerry.zhong on 2016/10/11. */ var ...
- Greenplum记录(二):估计存储容量
存储空间除了用来存储用户数据,还需要:landing backup files and data load files 空系统的存储空间:disk_size * number_of_disks 除去系 ...
- python collections模块
collections模块基本介绍 collections在通用的容器dict,list,set和tuple之上提供了几个可选的数据类型 namedtuple() factory function f ...
- Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...
- Bubble Cup 8 finals E. Spectator Riots (575E)
题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三 ...
- DX 系列之 ComboBoxEdit
参考资料: ComboBoxEdit.Properties.Items=ComboBoxItemCollection
- Redis安装测试(待完善)
1 Redis安装 在网址http://redis.io/下载redis-3.2.3.tar.gz,解压. 进入解压目录 编译和安装,具体配置项可参考自带的README.md文件 make test ...