C# Lambda表达式

[ C# 3.0/.NET 3.x 新增特性 ]

  回顾,发现上面的代码,需要传一个 匿名方法 ,写起来特别别扭。于是我们很想知道能否有简化的语法呢?微软告诉咱们:Of Course,必须有,它就是Lambda表达式。Lambda表达式是比匿名方法更简洁的一种匿名方法语法。

Lambda来源:1920年到1930年期间,数学家Alonzo Church等人发明了Lambda积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda(λ)来表示无名函数。近年来,函数式编程语言(如Lisp)使用这个术语来表示可以直接描述函数定义的表达式,表达式不再需要有名字了。

5.1 初识Lambda表达式lambda  5.1.1 Lambda表达式要点

    ①Lambda表达式中的参数列表(参数数量、类型和位置)必须与委托相匹配

    ②表达式中的参数列表不一定需要包含类型,除非委托有ref或out关键字(此时必须显示声明);

    ③如果没有参数,必须使用一组空的圆括号

  5.1.2 Lambda使用示例

static void LambdaDemo()
        {
            List<Person> personList = GetPersonList();
            Console.WriteLine("--------------------标准预定义委托--------------------");
            Console.WriteLine("Standard Action Delegate Show:");
            personList.ForEach(new Action<Person>(delegate(Person p)
                {
                    Console.WriteLine(p.ID + "-" + p.Name + "-" + p.Age);
                })
            );

            Console.WriteLine("Simple Action Delegate Show:");
            personList.ForEach(delegate(Person p)
            {
                Console.WriteLine(p.ID + "-" + p.Name + "-" + p.Age);
            });
            Console.WriteLine("--------------------Lambda表达式--------------------");
            Console.WriteLine("Lambda Expression Show:");
            personList.ForEach(p =>
                Console.WriteLine(p.ID + "-" + p.Name + "-" + p.Age));

            Console.WriteLine("FindAll:");
            var dataList = personList.FindAll(p => p.Age > 20);
            foreach (var item in dataList)
            {
                Console.WriteLine(item.ID + "-" + item.Name + "-" + item.Age);
            }

            Console.WriteLine("Sort:");
            personList.Sort((p1, p2) => p1.Age - p2.Age);

            Console.WriteLine("Select:");
            var selectList = personList.Select(p => new LitePerson() { Name = p.Name });
            foreach(var item in selectList)
            {
                Console.WriteLine(item.Name);
            }
        }
View Code

 

   调试运行的结果如下:

  5.1.3 Lambda本质探析

  (1)以上述案例中的Sort方法为例:personList.Sort((p1, p2) => p1.Age - p2.Age);

  (2)通过反编译工具,可以看到其实是声明了一个Comparison委托实例:

  (3)现在,我们来分析一下具体的步凑:有了前面的基础,现在再来看就轻松了许多,So Easy!

    ①编译器自动生成了一个Comparison委托:

    ②编译器帮我们创建了一个符合Comparison委托签名的静态方法:

    ③实例化Comparison委托变量,并将方法指针传入该委托;

    ④调用List<T>实例的Sort方法,并传入Comparison委托实例;

    其中,前面两步①和②可以通过反编译后的C#代码获知,而后面两步③和④则需要通过IL代码来分析,前面已经介绍过相关,这里就不再赘述。

5.2 回顾Lambda进化史

  前面了解了Lambda是什么,这里我们来回顾一下Lambda的演化过程。

  从演化过程可以知道,编译器在越来越智能地帮我们做着更多的事儿,而我们却在享受着编译器带来的便利沉浸在高效的开发效率中,变得越来越“懒”了。

5.3 语句Lambda

  Lambda表达式有两种类型:一是Lambda表达式,二是语句Lambda。

  那么,语句Lambda和表达式Lambda到底有何区别?

ANSWER:语句Lambda 和 表达式Lambda 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)。
EXAMPLES:
(1)表达式Lambda:
list.FindAll(d => d.Id > 2);// goes to
list.ForEach(d => Response.Write(d.ToString() + "<br/>"));

 

(2)语句Lambda:

list.ForEach(d => { if (d.Id > 2) { Response.Write(d.ToString() + "<br/>"); } });

 

  可以看出,语句Lambda的右侧有一个语句块,在这个大括号内的语句可能会有多条。

 

 

出处:http://edisonchou.cnblogs.com

posted @ 2020-05-29 11:46  delafqm  阅读(139)  评论(0编辑  收藏  举报