C# Lambda表达式

自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda表达式。只要有委托参数类型的地方,就可以使用Lambda表达式。

Lambda表达式的语法比匿名方法简单。如果所调用的方法有参数,且不需要参数,匿名方法的语法就比较简单,因为这样不需要提供参数。

直接上一些例子,读者可以自行运行调试。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static void Main(string[] args)  
  2. {  
  3.     //1、lambda之hello world.  
  4.     Func<stringstring> lambda = param =>  
  5.     {  
  6.         return param;  
  7.     };  
  8.   
  9.     Console.WriteLine(lambda("hello lambda."));  
  10.   
  11.     //2、lambda之参数  
  12.     Func<doubledoubledoubledouble> cube = (double x, double y, double z) => x * y * z;  
  13.     Console.WriteLine(cube(1, 2, 3));//输出6  
  14.   
  15.     //更进一步,参数的类型可以省略  
  16.     Func<doubledoubledoubledouble> cude1 = (x, y, z) => x * y * z;  
  17.     Console.WriteLine(cude1(2, 4, 6));//输出48  
  18.   
  19.     //3、lambda之调用外部参数  
  20.     int someValue = 4;  
  21.     Func<doubledoubledoubledouble> f = (x, y, z) => x + y + z + someValue;  
  22.     Console.WriteLine(f(1, 2, 3));//1+2+3+4=10  
  23. }  
在winform编程中,我们经常给某个按钮添加Click事件,最原始的写法是直接双击按钮,生成Click事件的代码,我们就可以直接在里面写方法了。其实这是vs替我们做了很多工作,其中就有在designer.cs文件中,生成了 this.button1.Click += new System.EventHandler(this.button1_Click);这样的代码,事件要注册才能触发。

我们采用匿名委托的写法,在窗体的Form_Load事件中添加如下代码,则可以触发button1的Click事件。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. this.button1.Click += delegate(object ss, EventArgs ee)  
  2. {  
  3.     MessageBox.Show("hello,this is button1.Click event...");  
  4. };  
再看看Lambda表达式的用法。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. this.button1.Click += (ss, ee) =>  
  2. {  
  3.     MessageBox.Show("hello,this is button1.Click event...");  
  4. };  
是不是更加简洁?

我们再看一下,从匿名方法到Lambda简写的演化过程,借一张图。

从这个演化过程,可以看出C#语言的发展变化过程。

下面详细演示一下Lambda的应用实例。

首先第一个实例我们应用Lambda对一个List<Student>列表进行循环、查找、排序等操作。

首先我们提供一个实体类:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class Student  
  2. {  
  3.     public Student(string name, int age)  
  4.     {  
  5.         this.Name = name;  
  6.         this.Age = age;  
  7.     }  
  8.   
  9.     public string Name { getset; }  
  10.     public int Age { getset; }  
  11. }  
然后我们初始化一个List,

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //初始化3个Student对象  
  2. var students = new List<Student>()  
  3. {  
  4.     new Student("zhang3",18),  
  5.     new Student("li4",22),  
  6.     new Student("wang5",20)  
  7. };  
[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //定义1个打印函数  
  2. Action<Student> print = student => Console.WriteLine(string.Concat(student.Name, ":", student.Age));  
那么,我们就可以先循环输出一下:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. students.ForEach(print);//循环打印输出  

如果我们要找到年龄大于20岁的学生,可以这样:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. students.FindAll(student => student.Age > 20).ForEach(print);  
进一步,我们按照学生的年龄进行排序:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. students.Sort((f1, f2) => f1.Age.CompareTo(f2.Age));  
  2. students.ForEach(print);//年龄从小到大排序后输出  

现在,我们按照在students列表里再加一个学生:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var students = new List<Student>()  
  2. {  
  3.     new Student("zhang3",18),  
  4.     new Student("li4",22),  
  5.     new Student("wang5",20),  
  6.     new Student("zhao6",20)  
  7. };  
现在要按照年龄进行分组,并统计出各个年龄阶段的人数:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var result = students.GroupBy(x => x.Age).Select(x => string.Concat(x.Key, ":", x.Count()));//先进行分组,再进行投影  
  2. result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//循环输出得到结果  

再提供一个综合性的例子,这是论坛里的caozhy版主提供的一个例子。用Lambda表达式实现快速排序。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Func<Func<intintbool>, Func<int[], int[]>> filter = x => new Func<int[], int[]>(y => y.Skip(1).Where(z => x(y[0], z)).ToArray());  
  2. Func<int[], int[]> qsort = x => x;  
  3. Func<int[], int[]> lesser = dt => filter((x, y) => y < x)(dt);  
  4. Func<int[], int[]> greater = dt => filter((x, y) => y >= x)(dt);  
  5.   
  6. qsort = dt => dt.Length > 1  
  7.     ? qsort(lesser(dt)).Concat(new int[] { dt[0] }).Concat(qsort(greater(dt))).ToArray() : dt;  
  8.   
  9. int[] data = { 4, 3, 1, 4, 6, 7, 5, 9, 3, 11, 1, 2, 11 };  
  10. var result = qsort(data);  
  11. result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//排完序后输出  

最后提供一下官方的C# Lambda表达式的权威资料。C# Lambda表达式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值