C#3.0为了更好支持LINQ语法,扩展了下面功能
- Lambda表达式
- 表达式树
- 关键字变量var 对象和集合初始化,以及匿名类型
- 扩展方法
- 分部方法
- 查询表达式
如果要理解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)
Previous: linq的延迟查询执行