LINQ教程三:Lambda表达式解剖
C#3.0(.NET3.5)中引入了Lambda表达式和LINQ。Lambda表达式是使用一些特殊语法表示匿名方法的较短方法。
最基本的Lambda表达式语法如下:
(参数列表)=>{方法体}
说明:
1、参数列表中的参数类型可以是明确类型或者推断类型。
2、如果是推断类型,则参数的数据类型将由编辑器根据上下文自动推断出来。
让我们看看Lambda表达式是如何从匿名方法演变而来的。
相关示例:
 delegate(int item) { return item %  == ; };
1、Lambda表达式从匿名方法演变,首先删除delegate关键字和参数类型并添加Lambda运算符=>,演变后的代码如下:
 (item)=>{return item %  == ;};
2、如果我们只有一个返回值的语句,那么我们不需要花括号、返回和分号,所以我们可以去掉这些符号,演变后的代码如下:
(item)=>item % == 0;
3、如果我们只有一个参数,我们也可以删除(),代码如下:
item=>item % == 0;
因此,我们得到如下所示的Lambda表达式:
item => item % 2 == 0
其中item是参数,=>是Lambda运算符,item % 2 == 0是正文表达式。
二、具有多个参数的Lambda表达式
如果需要传递多个参数,那么必须将参数括在括号内,如下所示:
(ints, item) => ints.Contains(item);
如果不想使用推断类型,那么可以给出每个参数的类型,如下所示:
(int[] ints, int item) => ints.Contains(item)
三、不带任何参数的Lambda表达式
在Lambda表达式中可以没有参数,如下所示:
 () => Console.WriteLine("这是一个不带任何参数的Lambda表达式");
四、正文表达式中有多条语句
在前面讲过,如果正文表达式有一个语句,那么可以去掉方法体外面的大括号。如果正文表达式中有多条语句,那么必须用大括号将正文表达式括起来,如下所示:
(ints, item) =>
{
Console.WriteLine("这是包含多条语句的Lambda表达式");
return ints.Contains(item);
};
五、表达式中的局部变量
你可以在表达式的主体中声明一个变量,以便在表达式主体的任何位置使用它,如下所示:
ints =>
{
int item = ;
return ints.Contains(item);
};
六、Lambda表达式中的内置泛型委托
1、Func委托
当你想从lambda表达式返回一些东西时,使用Func <> delegate。

其中T是输入参数的类型,TResult是返回类型。
示例代码如下:
Func<int[], bool> isContains = p => p.Equals();
int[] ints = { , , , , , , , };
bool isEquals = isContains(ints);
在上面的例子中,Func委托期望第一个输入参数是int[]类型,返回类型是boolean。Lambda表达式是p => p.Equals(10)。
2、Action委托
与Func委托不同,Action委托只能有输入参数。 当不需要从lambda表达式返回任何值时,请使用Action委托类型。
示例代码如下:
Action<int[]> PrintItem = p =>
{
foreach (int item in p)
{
Console.WriteLine(item);
}
};
int[] ints = { , , , , , , , };
PrintItem(ints);
七、在LINQ中使用Lambda表达式
通常情况下,Lambda表达式与LINQ查询一起使用。枚举静态类包括接受Func <TSource,bool>的IEnumerable <T>的Where扩展方法。IEnumerable <Int>集合的Where()扩展方法需要传递Func <Student,bool>,如下所示:

现在,您可以将分配给Func委托的lambda表达式传递给方法语法中的Where()扩展方法,如下所示:
Func<int, bool> isContains = p =>p.Equals ();
int[] ints = { , , , , , , , };
var result = ints.Where(isContains).ToList();
八、Lambda表达式要点总结
1、Lambda表达式是一种表示匿名方法的更短的方法。
2、Lambda表达式语法:parameters =>正文表达式
3、Lambda表达式可以在()中具有零个或多个参数。
4、Lambda表达式可以在大括号{}中的正文表达式中有一条或多条语句。
5、Lambda表达式可以分配给Func,Action或Predicate委托。
6、Lambda表达式可以以类似的方式调用委托。
LINQ教程三:Lambda表达式解剖的更多相关文章
- Linq快速入门——Lambda表达式的前世今生
		Linq快速入门——Lambda表达式的前世今生 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ... 
- Java基础教程:Lambda表达式
		Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ... 
- C++实现委托机制(三)——lambda表达式封装
		C++.引言: 其实原本没打算写这一章的,不过最后想了想,嗯还是把lambda表达式也一并封装进去,让这个委托也适应lambda表达式的注册.不过在之前还是需要先了解lamb ... 
- 关于Linq中的Lambda表达式中OrderBy的深入理解
		起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ... 
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
		当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ... 
- Linq专题之Lambda表达式
		这一节我们讲的Lambda表达式跟匿名函数有关.Lambda表达式就是一个匿名函数,它可以包含表达式和语句,并且可以创建委托和表达式树. Lambda表达式的组成: 输入参数.Lambda运算符(=& ... 
- Java基础教程(23)--lambda表达式
		一.初识lambda表达式 1.定义 lambda表达式是一个可传递的代码块,或者更确切地说,可以把lambda表达式理解为简洁地表示可传递的匿名方法的一种方式.它没有名称,但它有参数列表.函数主 ... 
- 三 lambda表达式有什么用
		(转载: https://mp.weixin.qq.com/s/-PHOc6p-qKJBktle28AUgA) 一: 直接把代码块赋值给变量 我们知道,对于一个Java变量,我们可以赋给其一个“值”. ... 
- LINQ和Lambda表达式
		前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ... 
随机推荐
- 【php】基础学习1
			其中包括php基础.字符串和正则表达式的学习.具体如下: <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta h ... 
- OpenCV245之SURF源代码分析
			一.fastHessianDetector函数分析 (1)參数 const Mat& sum 积分图片 const Mat& mask_sum vecto ... 
- Adobe推出HTML5动画设计工具Edge
			HTML5和Flash,是敌对?是共存? 虽然Flash如今依旧牢牢占领着网络动画的大半江山,但这样的状况终将会被改变. 那么,Edge的推出是否意味着Adobe将放弃和屈服于Flash与HTML5之 ... 
- JS高级心法——作用域链
			首先我们来看两个js中的代码: <script type="text/javascript"> var c=5; function t1(){ var d=6 f ... 
- ubuntu14.4开启ftp服务
			1 更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码" ... 
- unity physics joint
			除了unity文档(有点儿过于简略)之外,可以参考一下PhysX文档: http://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/ ... 
- Probability Concepts
			Probability Concepts Unconditional probability and Conditional Probability Unconditional Probability ... 
- verilog 不可综合语句
			转自http://bbs.ednchina.com/BLOG_ARTICLE_1770084.HTM 基础知识:verilog 不可综合语句 (1)所有综合工具都支持的结构:always,assig ... 
- 编译Sqoop2错误解决
			Sqoop2的代码结构相对于Sqoop做了大幅度调整,当中编译方式也从ant+maven杂糅的方式变为依赖maven3.今天将源码下下来,放到linux測试机器/export/build下后,执行&q ... 
- merge源表数据移植到目标表新表数据中
			merge into dbo.ak_SloteCardTimes a using(select RecordID,CardNO,SloteCardTime from dbo.Tb_CardDate b ... 
