返回类型 方法名(参数){方法体} //普通方法 delegate (参数列表) {方法体} //匿名方法 (参数列表)=>{方法体} //
Lambda表达式的引入是与委托类型的使用密切相关的,本质上,Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用。
下面用一个例子,展示简化的过程:
eg:找出整数List<T>中的偶数,我们调用了List<T>类型的FindAll()方法.这个方法需要System.Prediate<T>泛型委托,用于接收类型为T的输入参数并返回一个布尔值。
- 传统的委托使用方式。
定义一个单独的方法。
static void Main(string[] args) { List<int> list = new List<int>() { 1,5,10,20,33}; //使用传统委托语法调用FindAll Predicate<int> callback = new Predicate<int>(IsEvenNumber); List<int> evenNumbers = list.FindAll(callback); foreach (int num in evenNumbers) { Console.Write("{0} ",num); } Console.ReadLine(); } static bool IsEvenNumber(int i) { return (i % 2) == 0; }
- 匿名方法取代显示的委托函数。
不需要完整的方法定义。
static void Main(string[] args) { List<int> list = new List<int>() { 1, 5, 10, 20, 33 }; //使用匿名方法 List<int> evenNumbers = list.FindAll( delegate(int i) { return (i % 2 == 0); } ); foreach (var num in evenNumbers) { Console.WriteLine("{0}",num); } Console.ReadLine(); }
- 使用Lambda表达式。
进一步的简化。底层的委托消失的无隐无踪。
static void Main(string[] args) { List<int> list = new List<int>() { 1, 5, 10, 20, 33 }; //使用Lambda表达式 List<int> evenNumbers = list.FindAll(i=>(i%2)==0); foreach (var num in evenNumbers) { Console.WriteLine("{0}",num); } Console.ReadLine(); }
Lambda表达式可以应用与任何匿名方法可以应用的场合。Lambda表达式的格式:先定义参数列表,=>(可读为:goes to)紧随其后,然后是表达式。即Arguments ToProcess=>Statements ToProess Them
Lambda表达式也可以是一个代码块,包含多条语句。