下面是三个例子分别是用委托和匿名方法和Lambda表达式,可以对比分析一下Lambda表达式的好处。
委托
static void Main(string[] args)
{
Console.WriteLine("*** Fun With Lambdas ***\n ");
TraditionalDelegateSyntax();
Console.ReadKey();
}
static void TraditionalDelegateSyntax()
{
//创建整数列表
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
//使用传统委托调用FindALL()
Predicate<int> callback = new Predicate<int>(IsEvenNumber);
//泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
List<int> evenNumbers = list.FindAll(callback);
Console.WriteLine("here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.WriteLine("{0}\t", evenNumber);
}
Console.WriteLine();
}
static bool IsEvenNumber(int i)
{
//这是一个偶数吗
return (i % 2) == 0;
}
匿名方法
static void AnoymousMethodSyntax()
{
//建立整数表
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
//匿名方法
List<int> evenNumbers = list.FindAll(delegate(int i)
{ return i % 2 == 0; });
foreach (int evenNumber in evenNumbers)
{
Console.WriteLine("{0}\t", evenNumber);
}
Console.WriteLine();
}
Lambda表达式
static void LanmbdsExpressionSyntax()
{
//建立一个整数列表
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
//使用Lambda表达式
List<int> evenNumbers = list.FindAll(i => (i % 2) == 0);
foreach (int evenNumber in evenNumbers)
{
Console.WriteLine("{0}\t", evenNumber);
}
Console.WriteLine();
}
通过以上示例代码,可以发现用一个简短的Lambda表达式 i => (i % 2) == 0 来取代委托 Predicate<T> 或者关键字 delegate。Lambda表达式可以应用于任何匿名方法或者强类型委托可以应用的场合,而且比匿名方法更节省编码时间。
C#允许使用一系列代码语句来定义Lamnda表达式。当表达式必须使用多行代码处理参数时,可以使用一对花括号确定这些语句的范围。Lambda表达式可以处理多个参数或者不提供任何参数。