C# Lambda表达式详解,及Lambda表达式树的创建
转载自https://www.cnblogs.com/yunfeifei/p/3844814.html
雲霏霏博客
Lambda表达式
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。Lambda表达式x => x * x读作"x goes to x times x"。可以将此表达式分配给委托类型,如下所示:
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x; int j = myDelegate(5); //j = 25
}
若要创建表达式目录树类型(后面会详细说明):
复制代码
using System.Linq.Expressions;
namespace ConsoleApplication1
{
class Program { static void Main(string[] args) { Expression<del> myET = x => x * x; } }
}
复制代码
1、表达式Lambda
表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:
(input parameters) => expression
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:
(x, y) => x == y
有时,编译器难以或无法推断输入类型。 如果出现这种情况,你可以按以下示例中所示方式显式指定类型:
(int x, string s) => s.Length > x
使用空括号指定零个输入参数:
() => SomeMethod()
2、语句Lambda
当lambda表达式中,有多个语句时,写成如下形式:
(input parameters) => {statement;}
例如:
delegate void TestDelegate(string s);
…
TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };
myDel("Hello");
看到这里,Lambda的基础知识就学完了,下面来讲解一下实际中是如何运用的,这里写了几个小例子:
复制代码
List<string> Citys= new List<string>() { "BeiJing", "ShangHai", "Tianjin", "GuangDong" }; var result = Citys.First(c => c.Length > 7);
复制代码
这个是大家熟悉的LINQ语句,如果没学过没关系,这里用的只是很简单的几个方法,相信大家都能看懂。
首先定义一个Citys集合,初始化有一些数据。然后调用LINQ的first方法,查询出来长度大于7的第一个结果,看到了吧,这里用的就是Lambda表达式,
如果我们自己写,还要写循环遍历集合,然后判断字符串长度是否大于7,起码要写四五行代码,而这里只要一行就够了,而且LINQ也要写很长。
这里用的是最简单的Lambda表达式,(input parameters) => expression的形式。
下面来看一下,如何自己定义和使用Lambda表达式,首先写下面一个函数:
public void LambdaFun(string str,Func<string,string> func) { Console.WriteLine(func(str)); }
这里用到了Func委托,不懂的可以去百度查资料,这个方法什么都没有做,只是调用了委托方法,并将参数传递过去,下面来看一下使用方法:
复制代码
LambdaFun("BeiJing 2013", s =>
{ if (s.Contains("2013")) { s = s.Replace("2013", "2014"); } return s; });
复制代码
这里将传入字符串中的2013替换成为2014,当然还可以是将其他字符串替换城任何内容,或者是截取,连接等等,完全由我们传入的Lambda表达式决定,到了这里感觉到Lambda表达式的强大了吧。
lambda表达式树动态创建方法
复制代码
static void Main(string[] args) { //i*j+w*x ParameterExpression a = Expression.Parameter(typeof(int),"i"); //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点 ParameterExpression b = Expression.Parameter(typeof(int),"j"); BinaryExpression r1 = Expression.Multiply(a,b); //这里i*j,生成表达式树中的一个节点,比上面节点高一级 ParameterExpression c = Expression.Parameter(typeof(int), "w"); ParameterExpression d = Expression.Parameter(typeof(int), "x"); BinaryExpression r2 = Expression.Multiply(c, d); BinaryExpression result = Expression.Add(r1,r2); //运算两个中级节点,产生终结点 Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(result,a,b,c,d); Console.WriteLine(lambda + ""); //输出‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a Func<int, int, int, int, int> f= lambda.Compile(); //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托; Console.WriteLine(f(1, 1, 1, 1) + ""); //输出结果2 Console.ReadKey(); }
复制代码
为了便于大家理解,这点代码构成的Lambda表达式树如下图:
其实Lambda表达式并不难,只有理解了其中的原理,还是很快可以上手的!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[雪峰磁针石博客]2018最佳selenium工具书籍汇总下载(持续更新)
简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md的节选。 欢迎转载,转载请附带此简介,谢谢! Practical Web Scraping for Data Science -Best Practices and Examples with Python - 2018.pdf https://github.com/Apress/practical-web-scraping-for-data-science 星级 低于100 本书提供了完整的现代Web抓取指南,使用Python作为编程语言。 作者建议网络抓取作为任何数据科学家的强大工具,因为许多数据科学项目都是从获得适当的数据集开始的。 作者探讨了HTTP,HTML和CSS的核心概念,以提供坚实的基础。 除了快速的Python入门,它们还包括Selenium用于JavaScript重型站点和网络爬行的详细信息。 本书最后概述了最佳实践和一系列示例,这些示例汇集了您学到的所有内容,并说明了各种数据科学用例。 -- 本书的seleniu...
- 下一篇
区块链教程Fabric1.0源代码分析Orderer BroadcastServer
兄弟连区块链教程Fabric1.0源代码分析Orderer BroadcastServer,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 Fabric 1.0源代码笔记 之 Orderer #BroadcastServer(Broadcast服务端) 1、BroadcastServer概述 BroadcastServer相关代码在protos/orderer、orderer目录下。 protos/orderer/ab.pb.go,AtomicBroadcastServer接口定义。orderer/server.go,go,AtomicBroadcastServer接口实现。有个图 2、AtomicBroadcastServer接口定义 2.1、AtomicBroadcastServer接口定义 type AtomicBroadcastServer interface { Broadcast(AtomicBroadcast_BroadcastServer...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8