C# 3.0 / C# 3.5 Lambda 表达式
概述
Lambda 表达式的本质就是匿名函数。(而匿名方法的本质是委托)
“Lambda 表达式”是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式树类型。 (Lambda 表达式的运算符为 =>,读作“goes to”。=> 运算符具有与赋值运算符(=)相同的优先级)
Lambda 的基本形式是:
(input parameters) => expression
只有在 Lambda 有一个输入参数时,括号才是可选的,否则括号是必需的。
两个或更多输入参数由括在括号中的逗号分隔: (x, y) => x==y 。
有时,编译器难于或无法推断输入类型。如果出现这种情况,您可以按以下示例中所示的方式显式指定类型:
(int x, string s) => s.Length > x
使用空括号指定零个输入参数:
() => SomeMethod()
最常用的场景是 IEnumerable 和 IQueryable 接口的 Where(c => c.Id > 3) 。
下列规则适用于 Lambda 表达式中的变量范围:
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到 Lambda 表达式内引入的变量。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
Lambda 表达式缩写推演
new Func<string, int>(delegate (string str) { return str.Length; });
delegate (string str) { return str.Length; } //匿名方法
(string str) => { return str.Length; } //Lambda语句
(string str) => str.Length //Lambda表达式
(str) => str.Length //让编译器推断参数类型
str => str.Length //去掉不必要的括号
应用实例
一、
delegate int AddDel(int a, int b); //定义一个委托(与类同级) #region
AddDel fun = delegate (int a, int b) { return a + b; }; //匿名函数
AddDel funLambda = (a, b) => a + b; //lambda本质就是匿名函数(lambda参数类型可以进行隐式推断,可以省略类型)
//Console.WriteLine(fun(1, 3)); List<string> strs = new List<string>() { "", "", "" };
var temp = strs.FindAll(s => int.Parse(s) > ); foreach(var item in temp)
{
Console.WriteLine(item);
}
//Console.WriteLine(funLambda(1, 3));
#endregion
二、
static bool GetEvenNum(int num)
{
if(num % == )
{
return true;
}
return false;
} List<int> nums = new List<int>() { , , , , , , }; //使用委托方式
List<int> evenNums = nums.FindAll(GetEvenNum);
foreach(var item in evenNums)
{
Console.WriteLine(item);
} Console.WriteLine("使用 lambda 的方式");
List<int> evenNumLambda = nums.FindAll(n => n % == );
foreach (var item in evenNumLambda)
{
Console.WriteLine(item);
}
Console.ReadKey();
C# 3.0 / C# 3.5 Lambda 表达式的更多相关文章
- C#3.0之神奇的Lambda表达式和Lambda语句
“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型.所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to” ...
- C#3.0新增功能08 Lambda 表达式
连载目录 [已更新最新开发文章,点击查看详细] Lambda 表达式是作为对象处理的代码块(表达式或语句块). 它可作为参数传递给方法,也可通过方法调用返回. Lambda 表达式广泛用于: 将 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- Lambda表达式的前世今生
Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...
- Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...
- Lambda表达式 - 浅谈
概述: 只要有委托参数类型的地方,就可以使用 Lambda表达式.在讲述Lambda表达式之前,有必要先简要说明一下 委托中的"匿名方法": using System; using ...
- Lambda表达式的面纱(一)
在.NET3.0版本中微软推出了Lambda表达式.这使代码的表述可以更加优雅.但是对于新事物大多会本能的排斥,虽然3.0版本已经推出了好久了,但是我向周围的人了解了一下,用Lambda的人不是很多, ...
- C#之lambda表达式
从C#3.0开始,可以使用lambda表达式把实现代码赋予委托.lambda表达式与委托(http://www.cnblogs.com/afei-24/p/6762442.html)直接相关.当参数是 ...
随机推荐
- Latex 左右引号
参考: LaTeX技巧218:LaTeX如何正确输入引号:双引号""单引号'' Latex 左右引号 在latex中加引号时,使用""的输出为两个同向的引号: ...
- sublime text 中文显示异常
本文链接:sublime text 中文显示异常 http://www.cnblogs.com/daysme/p/7549857.html 前言 sublime text 3143 用了一年时候,最近 ...
- 2、Python程序控制结构(0530)
条件测试: 1.if 条件测试表达式 python的比较操作 1.所有的python对象都支持比较操作 可用于测试相等性.相对大小等: 如果是符合对象,python会检查其所有部分,包括自动遍历各级嵌 ...
- HDU 1512 Monkey King(左偏树模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意: 有n只猴子,每只猴子一开始有个力量值,并且互相不认识,现有每次有两只猴子要决斗,如果认识,就不打了 ...
- Maven Web项目解决跨域问题
跨域问题目前笔者所用到的方案大致有三种:jsonp,SpringMVC 4以上注解方式和cros三方过滤器. Jsonp JSONP(JSON with Padding)是一个非官方的协议,它允许在服 ...
- MyBatis数据库测试代码自动生成
<!-- generatorConfig.xml配置,其中:<plugin type="org.mybatis.generator.plugins.ToStringPlugin& ...
- JS绘制拓扑图示例 (JTopo)
目前在做的项目是渔政的监控,需要用到的设备包括雷达,光电,站点信息等,想要更直观的展现设备之间的连接关系和状态信息,这时候需要画一张拓扑图 在做拓扑图之前,首先要学习一下,html里面另一个比较常用的 ...
- 手动添加jar包到maven仓库
引言: 虽然配置了maven以后可以通过索引的方式自动下载jar包到本地maven仓库,从而使项目中直接使用本地仓库里面的架包, 但是这一招并不是每一次都灵应,也有遇到了失败的时候,当遇到失败的时候, ...
- link和@import区别
推荐使用:link 区别 1.从属关系区别@import是 CSS 提供的语法规则,只有导入样式表的作用:link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS.rel 连接属性 ...
- Linux实际常用命令
1.删除0字节文件 find -type f -size 0 -exec rm -rf {} \; 2.查看进程 按内存从大到小排列 ps -e -o “%C : %p : %z : %a”|sor ...