(转)Lambda表达式详解
本文转载自:http://www.cnblogs.com/knowledgesea/p/3163725.html
前言
1、天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西。
2、夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅。据说它是微软自c#1.0后新增的最重要的功能之一。
lambda简介
lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。
lambda表达式:
1.一个参数:param=>expr
2.多个参数:(param-list)=>expr
上面这些东西,记着,下面我们开始应用并阐述lambda,让你乐在其中。
lambda应用阐述
阐述这技术,我先上一个例子,然后再慢慢深入分析。例子如下:
- namespace 阐述lambda
- {
- public class Person
- {
- public string Name { get; set; }
- public int Age { get;set; }
- }
- class Program
- {
- public static List<Person> PersonsList()
- {
- List<Person> persons = new List<Person>();
- for (int i = ; i < ; i++)
- {
- Person p = new Person() { Name = i + "儿子", Age = - i, };
- persons.Add(p);
- }
- return persons;
- }
- static void Main(string[] args)
- {
- List<Person> persons = PersonsList();
- persons = persons.Where(p => p.Age > ).ToList(); //所有Age>6的Person的集合
- Person per = persons.SingleOrDefault(p => p.Age == ); //Age=1的单个people类
- persons = persons.Where(p => p.Name.Contains("儿子")).ToList(); //所有Name包含儿子的Person的集合
- }
- }
- }
看啦上面的例子,相信你能看出它确实是个甜枣,呵呵,下面我们来看下(p=>p.Age>6)这样的表达式,到底是怎么回事。。
首先我们看下委托
- //委托 逛超市
- delegate int GuangChaoshi(int a);
- static void Main(string[] args)
- {
- GuangChaoshi gwl = JieZhang;
- Console.WriteLine(gwl() + ""); //打印20,委托的应用
- Console.ReadKey();
- }
- //结账
- public static int JieZhang(int a)
- {
- return a + ;
- }
再看表达式
- //委托 逛超市
- delegate int GuangChaoshi(int a);
- static void Main(string[] args)
- {
- // GuangChaoshi gwl = JieZhang;
- GuangChaoshi gwl = p => p + ;
- Console.WriteLine(gwl() + ""); //打印20,表达式的应用
- Console.ReadKey();
- }
委托跟表达式的两段代码,我们可以看出一些东东吧:其实表达式(p => p + 10;)中的 p 就代表委托方法中的参数,而表达式符号右边的 p+10,就是委托方法中的返回结果。 大侠绕道,小虾理解下。
下面再上两个稍微复杂点的理解理解。
1.多参数的
- //委托 逛超市
- delegate int GuangChaoshi(int a,int b);
- static void Main(string[] args)
- {
- GuangChaoshi gwl = (p,z) => z-(p + );
- Console.WriteLine(gwl(,) + ""); //打印80,z对应参数b,p对应参数a
- Console.ReadKey();
- }
2. lambda主体运算复杂
- /// <summary>
- /// 委托 逛超市
- /// </summary>
- /// <param name="a">花费</param>
- /// <param name="b">付钱</param>
- /// <returns>找零</returns>
- delegate int GuangChaoshi(int a,int b);
- static void Main(string[] args)
- {
- GuangChaoshi gwl = (p, z) =>
- {
- int zuidixiaofei = ;
- if (p < zuidixiaofei)
- {
- return ;
- }
- else
- {
- return z - p - ;
- }
- };
- Console.WriteLine(gwl(,) + ""); //打印80,z对应参数b,p对应参数a
- Console.ReadKey();
- }
上面这些例子,好好理解下,下面我要介绍一个系统指定的 Fun<T>委托。
Func<T>委托
T 是参数类型,这是一个泛型类型的委托,用起来很方便的。
先上例子
- static void Main(string[] args)
- {
- Func<int, string> gwl = p => p + + "--返回类型为string";
- Console.WriteLine(gwl() + ""); //打印‘20--返回类型为string’,z对应参数b,p对应参数a
- Console.ReadKey();
- }
说明:我们可以看到,这里的p为int 类型参数, 然而lambda主体返回的是string类型的。
再上一个例子
- static void Main(string[] args)
- {
- Func<int, int, bool> gwl = (p, j) =>
- {
- if (p + j == )
- {
- return true;
- }
- return false;
- };
- Console.WriteLine(gwl(,) + ""); //打印‘True’,z对应参数b,p对应参数a
- Console.ReadKey();
- }
说明:从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型。
看完上面两个例子,相信大家应该明白啦Func<T>的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。
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 be = Expression.Multiply(a,b); //这里i*j,生成表达式树中的一个节点,比上面节点高一级
- ParameterExpression c = Expression.Parameter(typeof(int), "w");
- ParameterExpression d = Expression.Parameter(typeof(int), "x");
- BinaryExpression be1 = Expression.Multiply(c, d);
- BinaryExpression su = Expression.Add(be,be1); //运算两个中级节点,产生终结点
- Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,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(, , , ) + ""); //打印2
- Console.ReadKey();
- }
这段代码,放上来,仔细理解下,理解透彻啦,lambda表达式基本上也没什么啦。呵呵。。
算啦,我还是画个图算是结尾吧,以便于理解。
上段代码的lambda表达式树,图。
(转)Lambda表达式详解的更多相关文章
- Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)
Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解
Lambda表达式详解 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Lambda表达式详解
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...
- C# Lambda表达式详解,及Lambda表达式树的创建
最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...
- Lambda表达式详解(转载)
原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...
- Lambda表达式详解 (转)
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自C#1.0后新增的最重要的功能之一 ...
随机推荐
- Core Java Volume I — 5.1. Classes, Superclasses, and Subclasses
5.1. Classes, Superclasses, and SubclassesLet's return to the Employee class that we discussed in th ...
- Python编程感悟
从今年起开始学习python,最开始是听得MIT的那门公开课,然后又看了一本入门的书籍.但是总是没有觉得python很好用.可能的原因现在想起来是:IDE始终找不到顺手的,另外R用得太舒服了- any ...
- nginx+tomcat集群配置(2)---静态和动态资源的分离
前言: 在web性能优化的领域, 经常能听到一个词, 就是静态/动态资源分离. 那静态/动态资源分离究竟是什么呢? 本文不讲文件系统服务, 云存储, 也不讲基于CDN的优化. 就简单讲讲基于nginx ...
- sphinx搜索引擎架构图
- tomcat直接访问
解决了:http://blog.csdn.net/zhangyulin54321/article/details/8876320 <Context path="" docBa ...
- tyvj1012 P1012 - 火柴棒等式 ——暴力枚举
题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1012 可以发现:最大的数字绝对不超过999,只要枚举出0-999所有数字需要的火柴数,然后再枚举C和A, ...
- hdu1285 拓扑序
题意:有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩, ...
- Windows Git+TortoiseGit简易使用教程
转载自 http://blog.csdn.net/jarelzhou/article/details/8256139 官方教程:http://tortoisegit.org/docs/tortoise ...
- C/C++笔试题(很多)
微软亚洲技术中心的面试题!!! .进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2 ...
- 论文笔记之:Pedestrian Detection aided by Deep Learning Semantic Tasks
Pedestrian Detection aided by Deep Learning Semantic Tasks CVPR 2015 本文考虑将语义任务(即:行人属性和场景属性)和行人检测相结合, ...