Lambda表达式语法看上去真怪异,说白了是更好的匿名方法。废话不多说,先来看看使用匿名方法:
//首先使用集合初始化语法建立一个整型列表
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
//匿名方法 粉墨登场
List<int> oddNumbers = list.FindAll(
delegate(int i)
{
return (i % 2) != 0;
}
);//匿名方法结束
foreach (var oddNumber in oddNumbers)
{
//输出奇数
Console.WriteLine(oddNumber);
}
观察上面的匿名方法,我们使用delegate,而且还要保证输入参数的类型匹配,这种语法确实还是让人觉得冗长。下面看看Lambda表达式是如何简化FindAll()方法的:
//通过Lambda表达式就一句就搞定了!多神奇啊!传统的委托语法通通消失了
List<int> oddNumbers = list.FindAll(i => (i % 2) != 0);
解剖Lambda表达式
i => (i % 2) != 0
你一定注意到了Lambda表达式的 => 标记(读作 goes to),它的前面是一个参数列表,后面是一个表达式。
很明显,前面的参数列表并没有定义参数的类型(由编译器根据上下文推断出i是一个整型),所以它是隐式的。当然,我们也可以显示定义: (int i)=>(i%2)!=0);
我们这里参数列表只有一个参数,所以那个括号可以被省略。
接着我们再来看Lambda表达式块语句形式:
List<int> list = new List<int> { 1,2,3,4,5,6,7};
//因为表达式需要多行代码来处理参数
var testList=list.FindAll(i=>{
Console.WriteLine("调用FindAll()");
Console.WriteLine("i的值是{0}",i);
bool isOdd=((i%2)!=0);
Console.WriteLine("是否是奇数:"+isOdd);
return isOdd; //Lambda 必须返回满足某个条件的Bool值
});
foreach (var a in testList)
{
Console.WriteLine(a);
}