1、Lambda来源
1920年到1930年期间,数学家Alonzo Church等人发明了Lambda积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda(λ)来表示无名函数。近年来,函数式编程语言(如Lisp)使用这个术语来表示可以直接描述函数定义的表达式,表达式不再需要有名字。
2、Lambda表达式
Lambda表达式是C# 3.0/.NET 3.x 新增特性,Lambda表达式的语法由Lambda运算符和左边的参数部分以及右边的Lambda主体构成。
如下图,
例如,
using System;
class ListSort
{
static void Main()
{
int[] nums = { 3, 6, 8, 1, 2, 9 };
//使用匿名方法实现 Comparison
Array.Sort(nums, delegate (int i, int j) {
if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序
{ // 这里是倒序排列
return 0; //相等 返回 0
}
else if (i < j)
{
return 1;
}
else
return -1;
});
foreach (int i in nums)
Console.Write(i + ",");
Console.WriteLine();
nums = new int[] { 13, 16, 18, 11, 12, 19 };
//使用lambda实现 Comparison
Array.Sort(nums, (int i, int j) => { //使用匿名方法实现 Comparison
if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序
{ // 这里是倒序排列
return 0; //相等 返回 0
}
else if (i < j)
{
return 1;
}
else
return -1;
});
foreach (int i in nums)
Console.Write(i + ",");
Console.WriteLine();
nums = new int[] { 23, 26, 28, 21, 22, 29 };
//使用定义方法实现 Comparison
Array.Sort(nums, CompareValue);
#region output
foreach (int i in nums)
Console.Write(i + ",");
Console.WriteLine();
#endregion
}
private static int CompareValue(int i, int j)
{
if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序
{ // 这里是倒序排列
return 0; //相等 返回 0
}
else if (i < j)
{
return 1;
}
else
return -1;
}
}
注意:
1)Lambda表达式中的参数列表(参数数量、类型和位置)必须与委托相匹配;
2)表达式中的参数列表不一定需要包含类型,除非委托有ref
或out
关键字(此时必须显示声明);
3)如果没有参数,必须使用一组空的圆括号;
3、Lambda发展过程
从最开始委托匿名方法,发展到Lambda表达式,只是更方便了,本质是相同的。方法和委托等者是编译器帮我们声明定义了。变化过程如下图,
4、Lambda 语句和Lambda 表达式区别
Lambda表达式有两种类型:一是Lambda表达式,二是语句Lambda。语句Lambda 和 表达式Lambda 的区别在于,前者在 =>
右边有一个语句块(大括号),而后者只有一个表达式(没有return
和大括号)。
例如,
//Lambda 语句
Action<string> greet = name =>
{
string greeting = $"Hello {name}!";
Console.WriteLine(greeting);
};
greet("World");
//Lambda 表达式
Func<double, double> cube = x => x * x * x;
Console.WriteLine(cube(2))