WPF Lambda
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 = 0; i < 7; i++)
- {
- Person p = new Person() { Name = i + "儿子", Age = 8 - i, };
- persons.Add(p);
- }
- return persons;
- }
- static void Main(string[] args)
- {
- List<Person> persons = PersonsList();
- persons = persons.Where(p => p.Age > 6).ToList(); //所有Age>6的Person的集合
- Person per = persons.SingleOrDefault(p => p.Age == 1); //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(10) + ""); //打印20,委托的应用
- Console.ReadKey();
- }
- //结账
- public static int JieZhang(int a)
- {
- return a + 10;
- }
- //委托 逛超市
- delegate int GuangChaoshi(int a);
- static void Main(string[] args)
- {
- // GuangChaoshi gwl = JieZhang;
- GuangChaoshi gwl = p => p + 10;
- Console.WriteLine(gwl(10) + ""); //打印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 + 10);
- Console.WriteLine(gwl(10,100) + ""); //打印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 = 10;
- if (p < zuidixiaofei)
- {
- return 100;
- }
- else
- {
- return z - p - 10;
- }
- };
- Console.WriteLine(gwl(10,100) + ""); //打印80,z对应参数b,p对应参数a
- Console.ReadKey();
- }
Func<T>委托
T 是参数类型,这是一个泛型类型的委托,用起来很方便的。
先上例子
- static void Main(string[] args)
- {
- Func<int, string> gwl = p => p + 10 + "--返回类型为string";
- Console.WriteLine(gwl(10) + ""); //打印‘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 == 10)
- {
- return true;
- }
- return false;
- };
- Console.WriteLine(gwl(5,5) + ""); //打印‘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(1, 1, 1, 1) + ""); //打印2
- Console.ReadKey();
- }
这段代码,放上来,仔细理解下,理解透彻啦,lambda表达式基本上也没什么啦。呵呵。。
算啦,我还是画个图算是结尾吧,以便于理解。
上段代码的lambda表达式树,图。
例子:
调用时,无须传递参数,因为在接受方,只用一个参数。所以在这里不传递参数,=>表示要执行的方法
- private int _Length;
- public int Length
- {
- get{return _Length;}
- set{_Length=value;OnPropertyChanged(()=>Length;)}
- }
- protected virtual void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
- {}
WPF Lambda的更多相关文章
- WPF工作笔记:本地化支持、主进程通知、两种最常用异步编程方式
1.本地化支持 (1)重写控件默认的依赖属性LanguageProperty FrameworkElement.LanguageProperty.OverrideMetadata( typeof(Fr ...
- Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】
开发工具: VS2010 Blend Prism框架 基本概念: 数据绑定,依赖属性,依赖对象 WPF 委托式命令 Icommand接口 Lambda表达式 MVVM(Model-View-ViewM ...
- 转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式
原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用 ...
- 一种WPF在后台线程更新UI界面的简便方法
WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...
- await Task传异步Lambda问题
微软在.NET4.5中升级了C#语言到5.0,加入了await和async语法,极大地方便了广大开发人员的异步编程,也是为了和WinRT API配套,因为这套API充满了异步编程. 在开发过程中发现有 ...
- XNA+WPF solution worked
Cory Petosky's website Edit 11/17/2010: While this article's XNA+WPF solution worked when I wrote it ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
随机推荐
- Varnish 学习资料收集
高性能HTTP加速器Varnish(安装配置篇) 利用Varnish构建Cache服务器笔记 Varnish代理服务器部署 Varnish基础概念详解 Varnish的配置语言VCL及其内置变量介绍 ...
- 10.05 最初对Linux的了解,对Shell的认识
linux的起源:UNIX,代码开源,可以得到源代码,然后自己编译,通过以后可以运行程序. 特点:免费的;兼容POSIX1.0标准;多用户,多任务系统;良好的用户界面;提供了图形界面;支持多种文件系统 ...
- ES6摘抄
1.函数可选参数function log(x, y = 'World') {} 只能作为尾参数使用,因为如果不是尾参数还是要输入的.2.函数参数默认值与解构赋值结合使用.(注意对象冒号解构等号)fun ...
- leetcode 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: - 左括号必须用相同类型的右括号闭合. - 左括号必须以正确的顺序闭合. 注意空字符 ...
- poj 2981 Strange Way to Express Integers (中国剩余定理不互质)
http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 13 ...
- UWP开发入门(八)——聊天窗口和ItemTemplateSelector
我们平常用的最多的APP可能就是企鹅和微信了.有没有想过聊天窗口如何实现的?本篇我们将简单模拟一个聊天窗口. 聊天窗口大致上就是消息的一个集合列表.集合列表最常见的展现形式无非就是ListView.可 ...
- Enabling Remote Errors in SSRS
January 18, 2011 By default the remote errors property in SQL Server Reporting Services is set to fa ...
- java.lang.IllegalStateException: Cannot call sendError() after the response has been committed解读
源代码: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Ob ...
- java学习笔记—实现一个类MyInputStream(28)
1 实现一个类MyInputStream读取文件,且不能抛出异常 public class TestDemo { public static void main(String[] args) thro ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(77题)
77.Which two statements are true about sequences created in a single instance database? (Choose two. ...