Lambda表达式的形成
- Lambda这个小宝宝出生之前,大家为了把委托或事件写得简洁优雅(其实就是想偷懒),采用了匿名表达式。
- 可是,在实际使用过程中,大家还想再继续偷点懒,于是就绞尽脑汁地想把匿名表达式不断简化。
- 所以,Lambda表达式的使用前提是:在委托或事件中使用,单独拎出来使用是会报错的。
- 首先,我们通过匿名方法,来写一个委托。
delegate int MyDel(int x);
void main(string[] args){
MyDel mc += delegate(int x) {return x};
}
- 因为C#编译器能对返回值类型做出自动判断,mc的值可以被自动识别为MyDel,所以,MyDel这个类型可以直接省略不写,于是代码就被简化成了这样。
delegate int MyDel(int x);
void main(string[] args){
mc += delegate(int x) {return x};
}
- 然而,delegate这个关键字那么长,写起来好麻烦啊,但又不能不写(要用它标明这是委托类型),于是,人们就想着,用=>来代替delegate关键字,读作goes to。
delegate int MyDel(int x);
void main(string[] args){
mc += (int x) => {return x};
}
- 这时候,大家在想,既然我在定义委托类型的时候,已经写了参数类型,那我在写匿名函数的时候,再写一遍参数类型不就重复了吗?于是再省略一点,就出现了Lambda表达式的基础形态,后续的Lambda表达式在此基础上,出现各种演变。
delegate int MyDel(int x);
void main(string[] args){
mc += (x) => {return x};
}
有参无返回值
Action<string> action = msg => Console.WriteLine(msg);
action("")
有参有返回值
Func<int, int> func = (x) =>
{
return x + 100;
};
int result = func(900);
- 对于只有一个参数的方法体,可以省略括号;对于只有一行语句的方法体,可以省略大括号和return。
- 于是,进一步简化。
Func<int, int> func = x => x + 100;
int result = func(900);
Lambda作为参数
int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine($"数组中有{arr.Count(x => x % 2 == 1)}个奇数");