zoukankan      html  css  js  c++  java
  • Lambda表达式示例(转)

    转自:

    http://www.cnblogs.com/yangleiWPF/archive/2010/04/20/1716438.html 

    Lambda表达式

    C# 3.0为匿名方法提供了一个新的语法:Lambda表达式。Lambda表达式可以用于委托类型。“Lambda表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。

    所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x * x”。可以将此表达式分配给委托类型,如下所示:

        class Program

        {

            delegate int del(int i);

     

            static void Main(string[] args)

            {

                del myDelegate = x => x * x;

                int j = myDelegate(5); //j的值为调用委托所得到的值

                Console.WriteLine(j);   //值为25

                Console.ReadLine();

            }

        }

    现在基本上明白了Lambda表达式的写法,接下来我们结合匿名方法来做一个实例:

        class Program

        {

            delegate int del(int i);

     

            static void Main(string[] args)

            {

                del myDelegate = x => x * x;

                int j = myDelegate(5); //j的值为调用委托所得到的值

                Console.WriteLine(j);   //值为25

                //注意这里result实际上是del委托类的参数,所以一定是int类型

                del d1 = result =>    

                    {

                        result += 10;   //对传入的result参数做简单处理

                        return result; //返回结果

                    }; //注意大括号后面有一个分号作为结束

     

                Console.WriteLine(d1(2));   //直接调用委托,结果显示12

                Console.ReadLine();

            }

        }

    老田:给你布置个任务,自定义一个多个参数的委托类型,结合Lambda表达式和匿名方法来做个实例。

    小天:等等先问两个问题:

    1.                  为什么你上面第一个例题 del myDelegate = x => x * x;  这段代码中 => 符号后面的x * x 没有给大括号,但是第二个是给的大括号?

    2.                  多个参数在 => 符号前面怎么表示?

     

    老田:第一个问题:如同if语句一样,如果下面只有一行代码,则可以省略大括号;例如下面这样也是对的

                del myDelegate = x =>{ x * x};

     

    第二个问题:多个参数任然写在=> 符号前面,不过需要用括号括起来,同时多个参数之间用逗号分隔,例如

    Del d1 = (x, y, z) => z + y + z;

    小天:那就简单了。如下,我定义了一个名为XiaoTian的委托,两个参数,然后在匿名方法中对参数进行了简单的处理,最后返回这里我还做了点举一反三,如下:

        class Program

        {

            //三个参数的委托

            delegate string XiaoTian(string xr, int age, string sex);

     

            static void Main(string[] args)

            {

                //多个参数就必须使用括号,参数之间用逗号分隔

                XiaoTian xt = (xr, age, sex) =>

                    {

                        StringBuilder jg = new StringBuilder();

                        jg.Append("小天此人今年");

                        jg.Append(age);

                        jg.Append("岁,性别");

                        jg.Append(sex);

                        jg.Append(",长相");

                        jg.Append(xr);

                        return jg.ToString();   //直接返回结果

                    };

                //调用委托

                Console.WriteLine(xt("帅得一塌糊涂", 28, "男"));

                Console.ReadLine();

            }

        }

    运行后效果如图6-6

     

                                                     6-6

    老田:不错。上面我们讨论的都是预定义参数的情况下,那么假设传入的参数类型是自定义的类型,恰恰编译器推断不出来怎么办呢?那么接下来就要说到的是在为参数指定类型,如下:

        //自定义一个有两个属性的类

        class Thc

        {

            public Thc(string n, int a)

            {

                Name = n;

                Age = a;

            }

            public string Name { get; set; }

            public int Age { get; set; }

    }

    //控制台应用程序的起始类

       class Program

        {

            //使用自定义类型的参数

            delegate string More(Thc t);

            static void Main(string[] args)

            {

                //对参数申明类型

                More m =(Thc t )=>

                    {

                        return "姓名为" + t.Name + ",年龄" + t.Age;

                    };

                //调用委托,注意所给的参数是新实例一个对象

                Console.WriteLine(m(new Thc("天轰穿", 30)));

                Console.ReadLine();

            }

        }

           小天:上面说了这么多都是有参数的,如果遇上没有参数的咋办?

           老田:没有参数更省事,直接给个空的括号就行,如下:

        class Program

        {

            //无参数

            delegate void Wucanshu();

     

            static void Main(string[] args)

            {

                //对于无参数的情况就直接给一个空的括号就行了

                Wucanshu wcs = () =>

                {

                    Console.WriteLine( "我就是无参数,你把我咋样嘛!");

                };

                //调用委托

                wcs();

                Console.ReadLine();

            }

        }

  • 相关阅读:
    ubuntu1804隐藏顶部工作栏
    minilzo使用流程
    Linux内核设计与实现 总结笔记(第十六章)页高速缓存和页回写
    VS2015编译问题:模块对于 SAFESEH 映像是不安全的
    Linux内核设计与实现 总结笔记(第十五章)进程地址空间
    Linux内核设计与实现 总结笔记(第十四章)块I/O层
    Qt setStyleSheet
    Linux内核设计与实现 总结笔记(第十三章)虚拟文件系统
    Linux内核设计与实现 总结笔记(第十二章)内存管理
    Linux内核设计与实现 总结笔记(第十一章)定时器和时间管理
  • 原文地址:https://www.cnblogs.com/millen/p/1728758.html
Copyright © 2011-2022 走看看