C# Lambda表达式
[ C# 3.0/.NET 3.x 新增特性 ]
回顾,发现上面的代码,需要传一个 匿名方法 ,写起来特别别扭。于是我们很想知道能否有简化的语法呢?微软告诉咱们:Of Course,必须有,它就是Lambda表达式。Lambda表达式是比匿名方法更简洁的一种匿名方法语法。
Lambda来源:1920年到1930年期间,数学家Alonzo Church等人发明了Lambda积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda(λ)来表示无名函数。近年来,函数式编程语言(如Lisp)使用这个术语来表示可以直接描述函数定义的表达式,表达式不再需要有名字了。
5.1 初识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); } }
调试运行的结果如下:
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