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