委托、匿名函数到lambda表达式
在C#2.0之前就有委托了,在2.0之后又引入了匿名方法,C#3.0之后,又引入了Lambda表达式,他们三者之间的顺序是:委托->匿名表达式->Lambda表达式,微软的一步步升级,带给我们编程上的优美,简洁,可读性强.....其实是说到底Lambda表达式也是匿名方法的一种,下面咋们就简单聊聊这几者之间的微妙关系。
声明一个委托:
delegate int calculator(int num1, int num2);
下面分别采用委托方式、匿名方法方式以及lambda表达式来实现下:
(1)
calculator new_calculator = new calculator(NumAdd); //委托
private int NumAdd(int num1, int num2)
{
return num1 + num2;
}
int nums = new_calculator(10, 1);
(2)
calculator new_calculator2 = delegate(int a, int b) { return a + b; }; //匿名
int nums2 = new_calculator2(10, 1);
(3)
calculator new_calculator3 = (x, y) => x + y;//lambda表达式
int nums3 = new_calculator3(10, 1);
string strMsg = string.Format("nums={0},nums2={1},nums3={2}", nums, nums2, nums3);
很明显三种方式结果是一直都是11,但是有没有发现我们的代码在越来越精简,越来越显得有逼格,O(∩_∩)O哈哈~
这其实就是简单的例子来介绍下,这三者的关系,其实我们平时用的比较多的是Lambda表达式操作数据集合对象,下面举个小例子看看:
List<Person> listPerson = new List<Person>();
listPerson.Add(new Person { Name = "Alice", Address = "北京", Age = 30 });
listPerson.Add(new Person { Name = "Joe", Address = "上海", Age = 34 });
listPerson.Add(new Person { Name = "Cat", Address = "广州", Age = 24 });
listPerson.Add(new Person { Name = "Alan", Address = "深圳", Age = 26 });
listPerson.Add(new Person { Name = "Tom", Address = "重庆", Age = 28 });
listPerson.Add(new Person { Name = "Jarrey", Address = "天津", Age = 40 });
(Person就是个实体对象,在此就不贴声明实体对象的代码了)
现在咋们有了一个Person对象集合了,比如我们想用Lambda表达式处理下,得到Age小于30的Person:
//委托方式和Lambda表达式对比
(1)
IEnumerable<Person> result = listPerson.Where(delegate(Person p) { return p.Age < 30; });//委托方式
(2)
IEnumerable<Person> result = listPerson.Where (p => p.Age < 30); //Lambda表达式
如果我们用遍历的方式是不是也可以得到我们想要的对象集合?答案是: 当然可以
(3)
List<Person> listPersonNew = new List<Person>();
foreach (var item in listPerson)
{
if (item.Age <30)
{
listPersonNew.Add(item);
}
}
这是比较传统的方式,我么也可以直接用Lambda表达式遍历集合,舍弃传统的遍历方式:
(4)
List<Person> listPersonNew = new List<Person>();
listPerson.ForEach(p => {
if (p.Age <30)
{
listPersonNew.Add(p);
}
});
遍历以上四个结果会发现,结果一致,都包含了Cat、Alan、Tom三个人。
以上四种方式,如果是你,你会用哪种方式?方式一和方式二你更倾向哪种?方式三和方式四你又更倾向哪种?
其实总得来看,Lambda表达式还是为我们编码提供了更简便、更直观的方式,还是挺不错的。
委托、匿名函数到lambda表达式的更多相关文章
- 3 委托、匿名函数、lambda表达式
委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方 ...
- [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式
引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...
- 匿名函数:Lambda表达式和匿名方法
匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...
- C#语法之匿名函数和Lambda表达式
上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结.还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题.在使用委托 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- 测开之路八十二:匿名函数:lambda表达式
# 匿名函数:lambda表达式# lambda 参数: 逻辑f = lambda name: print(name)f('tom') f2 = lambda x, y: x + yprint(f2( ...
- 委托,匿名函数和lambda表达式
很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...
- C++的匿名函数(lambda表达式)
总述 C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的方式.匿名函数是我们需要用到的一个函数,但是又不想去费力命名一个函数的 ...
- 匿名函数、lambda表达式
匿名函数 func = lambda x: y #x是形参,y是返回值 键字lambda表示匿名函数,冒号前面的x表示函数参数,冒号后面的y表示匿名函数的返回值. 例1:返回列表中长度大于等于3的元素 ...
- 委托、匿名函数与Lambda表达式初步
(以下内容主要来自<C#本质论第三版>第十二章委托和Lambda表达式) 一.委托续 上上周五看了看委托,初步明白了其是个什么,如何定义并调用.上周五准备看Lambda表达式,结果发现C# ...
随机推荐
- InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式
InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...
- 20170927 Webservice发布指定账户进行访问
1. 搭建IIS 平台 于服务器A1 2.发布Webservice 到A1 我的问题在于(Webservice中方法中内容会对B1服务器的共享路径进行写入文件动作), 如何来控制网页使用特定的账户去访 ...
- mysql连接池不能回避的wait timeout问题(转)
起因 我们的项目组一直在使用albianj作为开发框架在开发应用.使用至今倒也是没有出现很大的问题,但最近加过监控的接口基本上都会在使用一段时间后,突然之间执行数据库操作变得很慢.虽然会变慢,但持续的 ...
- 003-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-分布式服务框架的选择
3.1.淘宝平台“服务化”历程 大约2007年,淘宝500人团队,维护一个war包,200多个功能模块. 1)项目团队协同成本高,业务响应越来越慢 2)应用复杂度超出人的认知负载. 3)错误难于隔离[ ...
- poi api工具
------------官网api地址 http://poi.apache.org/apidocs/index.html ------------官方下载地址 http://poi.apache.or ...
- 基于UDP/TCP协议的套接字
1.UDP UDP的数据报协议特点是不粘包,非可靠传输 服务端 import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ...
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- Vbox下的linux和windows共享文件设置
参考链接: https://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html
- list异常
可能定义的时候没有初始化把 private List<Msg> msgList = new ArrayList<>(); 为啥我android老是忘了new ArrayList
- python知识补足
1.class的init功能,初始化class,给出一些初始值 __init__可以理解成初始化class的变量,取自英文中initial 最初的意思.可以在运行时,给初始值附值, class Cal ...