实例-----(使用方法名,匿名的方法,Lambda表达式)------(转)
1.使用命名的方法:
场景:通用代码开发者想要创建一个通用的方法来筛选整型数组,但是这个通用方法要能够制定用来筛选该数组的的算法。
首先,开发者必须声明一个委托delegate,该委托的设计原型就是收到一个int(整型)类型,如果在被筛选的数组中确实包含一个int类型,则这个委托将返回true。
创建一个工具类并添加了delegate和筛选方法,这个公共代码如下:
1 public class Common 2 { 3 public delegate bool IntFilter(int i); 4 public static int[] FilterArrayOfInts(int[] ints, IntFilter filter) 5 { 6 System.Collections.ArrayList aList = new System.Collections.ArrayList(); 7 foreach (int i in ints) 8 { 9 if (filter(i)) 10 { 11 aList.Add(i); 12 } 13 } 14 return ((int[])aList.ToArray(typeof(int))); 15 } 16 }
以上FilterArrayOfInts 方法允许应用程序开发者将一个整型数组和一个delegate作为参数传递到筛选方法中,并将获得一个筛选后的数组。
现在,假定应用程序开发者只想筛选奇数,该方法在开发者的应用程序代码中进行了声明:
1 //应用程序开发者的筛选方法 2 public class APPlication 3 { 4 public static bool IsOdd(int i) 5 { 6 returen(i & 1 == 1); 7 } 8 }
根据 FilterArrayOfInts 方法中的代码,传入数组中的每个 int 整形都会调用这个方法。如果传送的 int 整形数是奇数,则此筛选方法将只返回true。下面是使用示例:
1 int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 2 3 int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd); 4 5 foreach (int i in oddNums) 6 7 { 8 9 Console.WriteLine(i); 10 11 }
请注意,要想将 delegate 传递为 FilterArrayOfInts 方法的第二个参数,应用程序开发者只需要传递该方法的名称。只需要简单的创建另一个筛选器,应用程序开发者可以筛选不同的数据。应用程序开发者还可以为偶数、素数,以及任何想要的规则创建筛选器。方法委托(delegate)可以通过这种方式成为具有很高可重用的代码。
2.使用匿名的方法
1 int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 2 3 int[] oddNums = Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); }); 4 5 foreach (int i in oddNums) 6 7 { 8 9 Console.WriteLine(i); 10 11 }
3,使用Lambda表达式
x => x.Length > 0
这个lambda表达式可以读做“x到x.Length>0”,或则读做“输入x返回x.Length > 0”。由于这个表达式的右边部分等于一个bool型值,则 delegate 应该指定该方法将返回一个bool型值,否则将会编译错误。
1 int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 2 3 int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1)); 4 5 foreach (int i in oddNums) 6 { 7 Console.WriteLine(i); 8 9 }<br><span style="font-size: 16px;"><strong><span style="color: rgb(255, 0, 0);">总结如下:</span></strong></span> 10 11 12 int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 13 14 //1.使用命名方法 15 16 int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd); 17 18 //2.使用匿名方法 19 20 int[] oddNums = Common.FilterArrayOfInts(nums 21 22 , delegate(int i) { return ((i & 1) == 1); }); 23 24 //3.使用lambda表达式 25 26 int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
如果使用 lambda 表达式,则上面的实例可以写成这样: