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表达式树,图。

时间: 2024-09-27 20:51:11

WPF Lambda的相关文章

在wpf中利用异步lambda编程,模拟数据库连接,防止界面假死

参考<图解C#>第20章异步编程第五节程序,解决在wpf中连接数据库,界面假死问题. public partial class MainWindow : Window { private bool isConnected = false; public MainWindow() { InitializeComponent(); startWorkButton.Click += async (sender, e) => { SetGuiValues(false, "正在连接数据库

XNA+WPF solution worked

Cory Petosky's website Edit 11/17/2010: While this article's XNA+WPF solution worked when I wrote it, in mid 2009, it no longer functions. This solution might get you halfway there, but I have not researched the other half as I am no longer regularly

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

原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用WPF/Silverlight绑定时,有件事情是很苦恼的:当ViewModel对象放生改变,需要通知UI.我们可以让VM对象实现INotifyPropertyChanged接口,通过事件来通知UI.但问题就出现这里…… 一,描述问题 情形:现在需要将一个Person对象的Name熟悉双向绑定到UI中

委托、lambda表达式、回调

今天接手wpf版的交通管理项目,由于前人一走,剩下一堆半成熟的代码交由我负责,随之我就开始了痛苦的阅读代码的过程. 前人是一个从事了5年的高手,写的代码很高深,各种委托.事件.lambda.回调到处都是,向我这种只懂简单的委托和事件的小白,读起来可想多痛苦.最痛苦的是,很少甚至没有注释,我顿时无语了.工作还得做,毕竟还得混下去,我就慢慢看他写的代码.今天看他的某个代码中的某个方法,具体如下. 下面的这个方法是执行查询的某个方法 1 /// <summary> 2 /// 执行查询 3 ///

WPF系列之三:实现类型安全的INotifyPropertyChanged接口,可以不用“Magic string” 么?

通常实现INotifyPropertyChanged接口很简单,为你的类只实现一个PropertyChanged 的Event就可以了. 例如实现一个简单的ViewModel1类: public class ViewModel1 : INotifyPropertyChanged { private string _data; public string Data { get { return _data; } set { if (_data == value) return; _data = v

拥抱新的.Net开发框架,WPF开发人员怎样向.Net迁移

ArcGIS Runtime 10.2版本号中.将WindowsPhone .WindowsStore以及WPF三大SDK整合成了一个全新的SDK--ArcGISRuntime SDK for Microsoft .Net Framework,简称.Net SDK.同一时候现有的WPF SDK能够继续使用.但兴许会停止更新.因此,Esri建议WPF开发人员们向.Net阵营迁移. 顾名思义,新的.NetSDK面向微软的.Net框架,曾经的WPF.Windows Phone以及Windows Sto

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// <param name="propertyFunc"></param> /// <param name="propertyValue"></param> public DemoClass (Expression<Func&

[转]深入浅出WPF(7)——数据的绿色通道,Binding

本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己的技术太差了,还有很多东西要学呀.门里门外,发现专业程序员非常重要的一项技能是读别人写的代码,这项技能甚至比自己写代码更重要.Anstinus同学就是读代码的高手,我写的代码他看两眼就知道怎么回事了,并且能够立刻修改,而他的代码我读了好几天还不知道是怎么回事儿呢. 2到7之间是留给XAML语言基础的

第5篇 WPF C# 数据绑定Model-View-ViewModel模式

第5篇  WPF C# 数据绑定Model-View-ViewModel模式 参考资料: John Sharp:<Microsoft Visual C# 2013 Step by Step> 周 靖 译:John Sharp<Visual C# 2012从入门到精通> 前言 Model-View-ViewModel模式即MVVM模式编程涉及五个文件: 1.MainWindow.xaml文件 UI界面文件 2.MainWindow.xaml.cs文件  UI架构文件 3.ViewMo