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 = 0; i < 7; i++)
  15. {
  16. Person p = new Person() { Name = i + "儿子", Age = 8 - 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 > 6).ToList(); //所有Age>6的Person的集合
  26. Person per = persons.SingleOrDefault(p => p.Age == 1); //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(10) + ""); //打印20,委托的应用
  7. Console.ReadKey();
  8. }
  9.  
  10. //结账
  11. public static int JieZhang(int a)
  12. {
  13. return a + 10;
  14. }

  

  1. //委托 逛超市
  2. delegate int GuangChaoshi(int a);
  3. static void Main(string[] args)
  4. {
  5. // GuangChaoshi gwl = JieZhang;
  6. GuangChaoshi gwl = p => p + 10;
  7. Console.WriteLine(gwl(10) + ""); //打印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 + 10);
  6. Console.WriteLine(gwl(10,100) + ""); //打印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 = 10;
  13. if (p < zuidixiaofei)
  14. {
  15. return 100;
  16. }
  17. else
  18. {
  19. return z - p - 10;
  20. }
  21.  
  22. };
  23. Console.WriteLine(gwl(10,100) + ""); //打印80,z对应参数b,p对应参数a
  24. Console.ReadKey();
  25. }

  

Func<T>委托

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

先上例子

  1. static void Main(string[] args)
  2. {
  3. Func<int, string> gwl = p => p + 10 + "--返回类型为string";
  4. Console.WriteLine(gwl(10) + ""); //打印‘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 == 10)
  6. {
  7. return true;
  8. }
  9. return false;
  10. };
  11. Console.WriteLine(gwl(5,5) + ""); //打印‘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(1, 1, 1, 1) + ""); //打印2
  21. Console.ReadKey();
  22. }

  

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

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

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

例子:

调用时,无须传递参数,因为在接受方,只用一个参数。所以在这里不传递参数,=>表示要执行的方法

  1. private int _Length;
  2. public int Length
  3. {
  4.  
  5. get{return _Length;}
  6.  
  7. set{_Length=value;OnPropertyChanged(()=>Length;)}
  8. }
  1. protected virtual void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
  2. {}

WPF Lambda的更多相关文章

  1. WPF工作笔记:本地化支持、主进程通知、两种最常用异步编程方式

    1.本地化支持 (1)重写控件默认的依赖属性LanguageProperty FrameworkElement.LanguageProperty.OverrideMetadata( typeof(Fr ...

  2. Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】

    开发工具: VS2010 Blend Prism框架 基本概念: 数据绑定,依赖属性,依赖对象 WPF 委托式命令 Icommand接口 Lambda表达式 MVVM(Model-View-ViewM ...

  3. 转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式

    原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用 ...

  4. 一种WPF在后台线程更新UI界面的简便方法

    WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...

  5. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  6. 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型

    今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...

  7. await Task传异步Lambda问题

    微软在.NET4.5中升级了C#语言到5.0,加入了await和async语法,极大地方便了广大开发人员的异步编程,也是为了和WinRT API配套,因为这套API充满了异步编程. 在开发过程中发现有 ...

  8. XNA+WPF solution worked

    Cory Petosky's website Edit 11/17/2010: While this article's XNA+WPF solution worked when I wrote it ...

  9. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...

随机推荐

  1. 四则运算生成器(java) 蔡苑菲,陆海燕

    github地址:https://github.com/Nancy0611/Myapp.git 一.项目相关要求 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 将生成10个 ...

  2. 咏南中间件新增SQL日志

    为了方便开发时跟踪调试SQL语句的执行情况,咏南中间件新增SQL日志,所有执行过的SQL都会写入SQL日志文件中. SQLDEBUG设为1,启用:设为0,停止写SQL日志.

  3. 转发一篇能看懂的关于ingress的说明

    最近发现好多人问 Ingress,同时一直也没去用 Nginx 的 Ingress,索性鼓捣了一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 https://mritd.me/2017/03/ ...

  4. 浏览器兼容性随手记:Javascript

    1.event IE9以下不支持直接获取event对象,所以需要写兼容: var event = event?event:window.event; IE8以下不支持event.target,但是可以 ...

  5. [Java]java内存及数据区

    Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area) 存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据 2.堆(Heap) 存放对象实例 ...

  6. c# 多线程线程池基础

    线程池的作用        在上一篇中我们了解了创建和销毁线程是一个昂贵的操作,要耗费大量的时间,太多的线程会浪费内存资源,当线程数量操作计算机CPU的数量后操作系统必须调度可运行的线程并执行上下文切 ...

  7. SQL 判断数据库是否有相关表 字段

    --判断数据库是否有相关表 if exists (select 1 from sysobjects where id = object_id(' 表名 ') and type = ' U ' ); - ...

  8. AutoMapper之如何开始,适合入门和演示

    原来想应该介绍下背景说明下好处什么的,仔细想都是废话 ,直接上代码吧. 首先有两个类,一个是和数据库对应的实体 Student,一个是和页面展示相关的页面模型 StudentModel. /// &l ...

  9. vim编辑后权限不够保存问题解决方案

    常常忘记了sudo就直接用vim编辑/etc内的文件,等编辑好了,保存时候才发现没权限. 1.曲线救国:先保存个临时文件,退出后再sudo cp回去 2.可以直接用 :w !sudo tee % 查阅 ...

  10. 【vue】——CDN或全局引入CSS、JS。

    在入口文件index.html中添加 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...