Lambda
2011-02-15 23:41 YZGJTSJT 阅读(385) 评论(0) 编辑 收藏 举报在Adam Freeman and Joseph C. Rattz, Jr.的著作《Pro LINQ》一书中,关于Lambda的讲解很精辟,把Lambda的演化讲解的很透彻。
public class Common
{
public delegate bool IntFilter(int i);
public static int[] FilterArrayOfInts(int[] ints, IntFilter filter)
{
ArrayList aList = new ArrayList();
foreach (int i in ints)
{
if (filter(i))
{
aList.Add(i);
}
}
return ((int[])aList.ToArray(typeof(int)));
}
}
{
public delegate bool IntFilter(int i);
public static int[] FilterArrayOfInts(int[] ints, IntFilter filter)
{
ArrayList aList = new ArrayList();
foreach (int i in ints)
{
if (filter(i))
{
aList.Add(i);
}
}
return ((int[])aList.ToArray(typeof(int)));
}
}
public class Application
{
public static bool IsOdd(int i)
{
return ((i & 1) == 1);
}
}
{
public static bool IsOdd(int i)
{
return ((i & 1) == 1);
}
}
在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd);
foreach (int i in oddNums)
Console.WriteLine(i);
Here are the results:
/* 1 3 5 7 9 */
C# 2.0 引入了匿名方法。
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] oddNums =Common.FilterArrayOfInts(
nums, delegate(int i) { return ((i & 1) == 1); });
foreach (int i in oddNums)
Console.WriteLine(i);
Here are the results:
/* 1 3 5 7 9 */
而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
foreach (int i in oddNums)
Console.WriteLine(i);
Here are the results:
/* 1 3 5 7 9 */
三种书写方式对比
// using named method
public static bool IsOdd(int i)
{
return ((i & 1) == 1);
}
Common.FilterArrayOfInts(nums, Application.IsOdd);
// using anonymous method
Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); });
// using lambda expression
Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
最后作者也指出,无论你是使用命名方法、匿名方法,或lambda表达式,根据实际项目需要,选择适合的。三者没有孰优孰劣。