C#基础:Lambda表达式
从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。
现在回过头来看我们的例子。下面的代码与【C#基础:匿名方法】一文中的代码具有相同的效果:
- class Program
- {
- static void Main(string[] args)
- {
- List<string> names = new List<string>();
- names.Add("Sunny Chen");
- names.Add("Kitty Wang");
- names.Add("Sunny Crystal");
- List<string> found = names.FindAll
- (
- // Lambda Expression Implementation
- name => name.StartsWith(
- "sunny",
- StringComparison.OrdinalIgnoreCase)
- );
- if (found != null)
- {
- foreach (string str in found)
- Console.WriteLine(str);
- }
- }
- }
上面的Lambda Expression Implementation在效果上与匿名方法没有任何区别,“=>”左边的name定义了参数(当参数个数为1的时候,圆括号可以省略),“=>”右边定义执行体。由于C# 3.0编译器具有Type Inference的能力,参数类型与返回值都将由编译器通过上下文判定,因此与匿名方法不同,Lambda表达式的参数可以不给定参数类型。当所表示的匿名方法没有任何参数时,Lambda表达式也同样可以使用,只需在“=>”左边用一对圆括号表示即可。即:
- () => Console.WriteLine("Hello!");
事实上,“Lambda表达式”这一词比较笼统,事实上“=>”运算符既可以表示Lambda表达式,也可以表示Lambda语句。Lambda语句由代码块组成,形式上很像匿名方法。请看下面的例子:
- class Program
- {
- static void Main(string[] args)
- {
- // Lambda 表达式
- Func<int, bool> dele1 = n => n > 10;
- // Lambda 语句
- Func<int, bool> dele2 = (int n) => { return n > 10; };
- Console.WriteLine(dele1(16));
- Console.WriteLine(dele1(8));
- }
- }
两种定义方法同样可以正确地输出结果。请注意,当我们希望构建表达式树的时候,情况却完全不同了:
- // ok
- Expression<Func<int, bool>> expr1 = n => n > 10;
- // error: cannot converted to an expression tree
- Expression<Func<int, bool>> expr2 = (int n) => { return n > 10; };
由此可见,在构建表达式树的时候,不能用Lambda语句(带有代码语句的Lambda表达式),而应该使用Lambda表达式。从这里就可以看出匿名方法与Lambda表达式的区别了。
有关委托的高级话题以及表达式树的内容,我会在后面的文章中继续研究。
C#基础:Lambda表达式相关推荐
- Java基础-Lambda表达式基础练习
Lambda表达式基础练习 Lambda表达式得格式:(形式参数)->{代码块} Lambda表达式使用前提: 有一个接口 接口中有且仅有一个抽象方法 练习1:定义一个接口(Eatable),里 ...
- Java基础-Lambda表达式
Lambda表达式 Lambda表达式概述 Lambda表达式语法 Lambda表达式案例 Lambda表达式总结 Lambda表达式概述 Lambda 表达式,也可称为闭包,它是推动 Java 8 ...
- Java 基础 —— Lambda 表达式
概述 阅读项目代码时,尤其是阅读一些源码时,经常会遇到 Lambda 表达式.对此之前看过相关文章,但是停留在模模糊糊的印象上.今天趁着有时间,通过一些 demo 示例,梳理一下它的用法,以备后期遗忘 ...
- Python基础 lambda表达式
# -*- coding: utf-8 -*-fun1 = lambda x,y : x + y print('fun1(2,3)=' , fun1(2,3)) # fun1(2,3)= 5fun2 ...
- [Java基础]Lambda表达式和匿名内部类的区别
- [Java基础]Lambda表达式的注意事项
- [Java基础]Lambda表达式的省略模式
- [Java基础]Lambda表达式的格式与使用前提
- [Java基础]Lambda表达式练习
代码如下: package LambdaPracticePack;public interface Eatable {void eat(); } package LambdaPracticePack; ...
- 刻意练习:Python基础 -- Task05. 函数与Lambda表达式
背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...
最新文章
- LVM 逻辑卷的扩容/缩容
- JavaScript递归应用与实践
- java 定时还款 技术_详解java定时任务
- springboot实现语言切换
- PHP怎么做成Qq空间相册,美化QQ空间相册的照片4步走 让你轻松学会PS
- umount target is busy
- android画图奥运五环,Android 自定义View 画圆(奥运五环)
- Swagger设置密码登录
- J2EE学习推荐书籍
- B站视频下载器,超清4k视频下载,一键解析视频合集,支持批量下载提取视频封面
- 【Kafka】Kafka的Rebalance机制可能造成的影响及解决方案
- 6种提高客户满意度的方法
- 初探Java设计模式5:一文了解Spring涉及到的9种设计模式
- 微星主板黑苹果_小白安装黑苹果应该要知道的事情
- 【艾特淘】什么是手淘搜索流量?
- 产品市场研究的方法有哪些
- 【计算机网络】冗余码计算
- 论文笔记——Stitcher:Feedback-driven Data Provider for Object Detection
- spss分析qpcr数据_实时荧光定量PCR的三种数据分析方法比较.doc
- 系统架构之业务逻辑层
热门文章
- getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快
- Java牛客专项练习2020.12.10
- C++STL与泛型编程(2) 第一个C++ STL Application
- 2013驾考科目三考试难点解析
- 基于OpenCL的mean filter性能
- 10岁起编程,并不认为自己是“黑客”
- H264基本概念之 宏块、片和片组
- sps及pps在解码器内传递过程
- IntelliJ IDEA中新建JAVA WEB项目、maven项目
- js 实现用window.print()打印页面中的部分内容,局部打印