本文转载自: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应用阐述

阐述这技术,我先上一个例子,然后再慢慢深入分析。例子如下:

  1. namespace 阐述lambda
  2. {
  3. public class Person
  4. {
  5. public string Name { get; set; }
  6. public int Age { get;set; }
  7. }
  8. class Program
  9. {
  10.  
  11. public static List<Person> PersonsList()
  12. {
  13. List<Person> persons = new List<Person>();
  14. for (int i = ; i < ; i++)
  15. {
  16. Person p = new Person() { Name = i + "儿子", Age = - i, };
  17. persons.Add(p);
  18. }
  19. return persons;
  20. }
  21.  
  22. static void Main(string[] args)
  23. {
  24. List<Person> persons = PersonsList();
  25. persons = persons.Where(p => p.Age > ).ToList(); //所有Age>6的Person的集合
  26. Person per = persons.SingleOrDefault(p => p.Age == ); //Age=1的单个people类
  27. persons = persons.Where(p => p.Name.Contains("儿子")).ToList(); //所有Name包含儿子的Person的集合
  28. }
  29. }
  30. }

  看啦上面的例子,相信你能看出它确实是个甜枣,呵呵,下面我们来看下(p=>p.Age>6)这样的表达式,到底是怎么回事。。

首先我们看下委托

  1. //委托 逛超市
  2. delegate int GuangChaoshi(int a);
  3. static void Main(string[] args)
  4. {
  5. GuangChaoshi gwl = JieZhang;
  6. Console.WriteLine(gwl() + ""); //打印20,委托的应用
  7. Console.ReadKey();
  8. }
  9.  
  10. //结账
  11. public static int JieZhang(int a)
  12. {
  13. return a + ;
  14. }

  再看表达式

  1. //委托 逛超市
  2. delegate int GuangChaoshi(int a);
  3. static void Main(string[] args)
  4. {
  5. // GuangChaoshi gwl = JieZhang;
  6. GuangChaoshi gwl = p => p + ;
  7. Console.WriteLine(gwl() + ""); //打印20,表达式的应用
  8. Console.ReadKey();
  9. }

  委托跟表达式的两段代码,我们可以看出一些东东吧:其实表达式(p => p + 10;)中的 p 就代表委托方法中的参数,而表达式符号右边的 p+10,就是委托方法中的返回结果。 大侠绕道,小虾理解下。

下面再上两个稍微复杂点的理解理解。

1.多参数的

  1. //委托 逛超市
  2. delegate int GuangChaoshi(int a,int b);
  3. static void Main(string[] args)
  4. {
  5. GuangChaoshi gwl = (p,z) => z-(p + );
  6. Console.WriteLine(gwl(,) + ""); //打印80,z对应参数b,p对应参数a
  7. Console.ReadKey();
  8. }

  2. lambda主体运算复杂

  1. /// <summary>
  2. /// 委托 逛超市
  3. /// </summary>
  4. /// <param name="a">花费</param>
  5. /// <param name="b">付钱</param>
  6. /// <returns>找零</returns>
  7. delegate int GuangChaoshi(int a,int b);
  8. static void Main(string[] args)
  9. {
  10. GuangChaoshi gwl = (p, z) =>
  11. {
  12. int zuidixiaofei = ;
  13. if (p < zuidixiaofei)
  14. {
  15. return ;
  16. }
  17. else
  18. {
  19. return z - p - ;
  20. }
  21.  
  22. };
  23. Console.WriteLine(gwl(,) + ""); //打印80,z对应参数b,p对应参数a
  24. Console.ReadKey();
  25. }

上面这些例子,好好理解下,下面我要介绍一个系统指定的 Fun<T>委托。

Func<T>委托

T 是参数类型,这是一个泛型类型的委托,用起来很方便的。

先上例子

  1. static void Main(string[] args)
  2. {
  3. Func<int, string> gwl = p => p + + "--返回类型为string";
  4. Console.WriteLine(gwl() + ""); //打印‘20--返回类型为string’,z对应参数b,p对应参数a
  5. Console.ReadKey();
  6. }

说明:我们可以看到,这里的p为int 类型参数, 然而lambda主体返回的是string类型的。

再上一个例子

  1. static void Main(string[] args)
  2. {
  3. Func<int, int, bool> gwl = (p, j) =>
  4. {
  5. if (p + j == )
  6. {
  7. return true;
  8. }
  9. return false;
  10. };
  11. Console.WriteLine(gwl(,) + ""); //打印‘True’,z对应参数b,p对应参数a
  12. Console.ReadKey();
  13. }

说明:从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型。

看完上面两个例子,相信大家应该明白啦Func<T>的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。

lambda表达式树动态创建方法

  1. static void Main(string[] args)
  2. {
  3. //i*j+w*x
  4. ParameterExpression a = Expression.Parameter(typeof(int),"i"); //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
  5. ParameterExpression b = Expression.Parameter(typeof(int),"j");
  6. BinaryExpression be = Expression.Multiply(a,b); //这里i*j,生成表达式树中的一个节点,比上面节点高一级
  7.  
  8. ParameterExpression c = Expression.Parameter(typeof(int), "w");
  9. ParameterExpression d = Expression.Parameter(typeof(int), "x");
  10. BinaryExpression be1 = Expression.Multiply(c, d);
  11.  
  12. BinaryExpression su = Expression.Add(be,be1); //运算两个中级节点,产生终结点
  13.  
  14. Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,a,b,c,d);
  15.  
  16. Console.WriteLine(lambda + ""); //打印‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a
  17.  
  18. Func<int, int, int, int, int> f= lambda.Compile(); //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托;
  19.  
  20. Console.WriteLine(f(, , , ) + ""); //打印2
  21. Console.ReadKey();
  22. }

这段代码,放上来,仔细理解下,理解透彻啦,lambda表达式基本上也没什么啦。呵呵。。

算啦,我还是画个图算是结尾吧,以便于理解。

上段代码的lambda表达式树,图。

(转)Lambda表达式详解的更多相关文章

  1. Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

    Lambda表达式详解(例子详解)     lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...

  2. Java 8 Lambda 表达式详解

    一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...

  3. 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解

    Lambda表达式详解   前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...

  4. JAVA8之lambda表达式详解

    原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...

  5. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  6. Lambda表达式详解

    前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...

  7. C# Lambda表达式详解,及Lambda表达式树的创建

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  8. Lambda表达式详解(转载)

    原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...

  9. Lambda表达式详解 (转)

    前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自C#1.0后新增的最重要的功能之一 ...

随机推荐

  1. 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 ...

  2. Python编程感悟

    从今年起开始学习python,最开始是听得MIT的那门公开课,然后又看了一本入门的书籍.但是总是没有觉得python很好用.可能的原因现在想起来是:IDE始终找不到顺手的,另外R用得太舒服了- any ...

  3. nginx+tomcat集群配置(2)---静态和动态资源的分离

    前言: 在web性能优化的领域, 经常能听到一个词, 就是静态/动态资源分离. 那静态/动态资源分离究竟是什么呢? 本文不讲文件系统服务, 云存储, 也不讲基于CDN的优化. 就简单讲讲基于nginx ...

  4. sphinx搜索引擎架构图

  5. tomcat直接访问

    解决了:http://blog.csdn.net/zhangyulin54321/article/details/8876320 <Context path="" docBa ...

  6. tyvj1012 P1012 - 火柴棒等式 ——暴力枚举

    题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1012 可以发现:最大的数字绝对不超过999,只要枚举出0-999所有数字需要的火柴数,然后再枚举C和A, ...

  7. hdu1285 拓扑序

    题意:有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩, ...

  8. Windows Git+TortoiseGit简易使用教程

    转载自 http://blog.csdn.net/jarelzhou/article/details/8256139 官方教程:http://tortoisegit.org/docs/tortoise ...

  9. C/C++笔试题(很多)

    微软亚洲技术中心的面试题!!! .进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2 ...

  10. 论文笔记之:Pedestrian Detection aided by Deep Learning Semantic Tasks

    Pedestrian Detection aided by Deep Learning Semantic Tasks CVPR 2015 本文考虑将语义任务(即:行人属性和场景属性)和行人检测相结合, ...