Lambda表达式

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);
}

示例的运行结果如下:

image

请注意,要想将 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));



posted @ 2013-08-15 23:43  Joe-xin  阅读(348)  评论(0编辑  收藏  举报