C#3.0对LINQ的增强和理解Lambda表达式

C#3.0为了更好支持LINQ语法,扩展了下面功能

  1. Lambda表达式
  2. 表达式树
  3. 关键字变量var 对象和集合初始化,以及匿名类型
  4. 扩展方法
  5. 分部方法
  6. 查询表达式

如果要理解Lambda则需要先理解委托、匿名方法这些东西。

委托是函数指针。委托可以把一个函数存放到委托变量里面。然后调用这个委托的时候,就可以调用这个函数。

比如我们下面做一个例子。

class Program
{
    //定义一个委托 输入整数 输出布尔类型
    public delegate bool IsOddDelegate(int input);

    //定义一个符合上面委托的 方法 返回输入的数 是否是布尔类型
    public static bool IsOdd(int input)
    {
        return input % 2 == 1;
    }

    //封装一个普通方法 传入旧数组 和委托变量 返回新数组 新数组是去掉奇数的
    public static int[] FilterArray(int[] oldArray, IsOddDelegate dele)
    {
        var newList = new List<int>();
        foreach (var item in oldArray)
        {
            if (!dele(item))
            {
                newList.Add(item);
            }
        }
        return newList.ToArray();
    }

    static void Main(string[] args)
    {
        int[] arr = new int[] { 12, 42, 46, 23, 3, 42, 353, 34, 43, 143, 57, 5, 68, 867, 568, 7 };
        int[] newArr = FilterArray(arr, IsOdd);
        Console.ReadKey();
    }
}Code language: PHP (php)

我们可以继续改造上面的类,使用匿名方法的方式,不需要特意编写一个方法。

//定义一个委托 输入整数 输出布尔类型
public delegate bool IsOddDelegate(int input);

//封装一个普通方法 传入旧数组 和委托变量 返回新数组 新数组是去掉奇数的
public static int[] FilterArray(int[] oldArray, IsOddDelegate dele)
{
    var newList = new List<int>();
    foreach (var item in oldArray)
    {
        if (!dele(item))
        {
            newList.Add(item);
        }
    }
    return newList.ToArray();
}

//直接传入匿名函数给委托
static void Main(string[] args)
{
    int[] arr = new int[] { 12, 42, 46, 23, 3, 42, 353, 34, 43, 143, 57, 5, 68, 867, 568, 7 };
    int[] newArr = FilterArray(arr, delegate(int i) { return i % 2 == 1; });
    Console.ReadKey();
}Code language: PHP (php)

上面的匿名方法非常酷,开发者不需要在任何位置声明一个方法。但是会使得代码冗长,也难以阅读。为了解决一个问题,我们使用另外一种更加简洁的方式,就是lambda表达式。

lambda表达式可以写成一个逗号分隔的参数列表,后面加一个lambda操作符=>,然后再后面就是一个表达式或声明函数。如果有多个输入参数,则使用圆括号包含输入参数。

(param1,param2,.....,paramN) => {
    语句1;
    语句2;
    ...
    语句n;
    return (委托指明的返回类型);
}Code language: PHP (php)

下面是一个最简单的lambda表达式

x => xCode language: PHP (php)

等同下面

int getddd(int x)
{
    return x;
}Code language: JavaScript (javascript)

意思就是输入x返回x。如果delegate要求输入字符串返回bool,则上面的lambda式子就不正确了。可以写成这样:

x => x.Length > 0Code language: PHP (php)

如果delegate要求返回int,则我们可以使用:

x => x.LengthCode language: PHP (php)

如果传入多个参数,参数使用逗号分隔:

(x,y) => x == yCode language: PHP (php)

复杂的lambda表达式甚至需要使用函数声明{}

(x,y) => {
    if(x > y)
        return x;
    else
        return y;
}Code language: PHP (php)

总之,重点要记住,delegate定义了输入什么类型和必须返回什么类型的值,则需要和lambda的定义一致。

如果使用lambda表达式,则上面的例子可以写成这样:

int[] arr = new int[] { 12, 42, 46, 23, 3, 42, 353, 34, 43, 143, 57, 5, 68, 867, 568, 7 };
int[] newArr = FilterArray(arr, i => i % 2 == 1);Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注