Lambda介绍与案例分析
1.结构组成图
(参数) =>{操作}

2.Lambda表示式
"Lambda表达式"一种可用于创建委托或表达式目录树的匿名函数。
一种高效的类似于函数式编程的表达式。
Lambda简化了开发中需要编写的代码量。
Lambda 表达式可以包含表达式和语句。
所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。
Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
Lambda表达式 *x => x x** 读作"x goes to x times x"。可以将此表达式分配给委托类型,如下所示:
将HTML实体转换为正常符号后的代码如下:
1. delegate int del(int i); // 定义一个委托
2. del myDelegate = x => x * x; // Lambda表达式,此时 myDelegate() 方法定义了一个操作 参数 * 参数
3. int j = myDelegate(5); // j = 25
PS:Lambda 表达式是由 .NET 2.0 演化而来的,也是 LINQ 的基础,熟练地掌握 Lambda 表达式能够快速地上手 LINQ 应用开发。
Lambda 表达式在一定程度上就是 匿名方法 的 另一种表现形式。
3. 案例
3.1 Lambda 与 Linq 的使用
先创建一个对象类
public class People {
public int age { get; set; } // 设置属性
public string name { get; set; } // 设置属性
public People(int age, string name) // 设置属性 (构造函数构造)
{
this.age = age; // 初始化属性值 age
this.name = name; // 初始化属性值 name
}
}
然后录入数据,制作一个数据源
List<People> people = new List<People>(); // 创建泛型对象
People p1 = new People(21, "guojing"); // 创建一个对象
People p2 = new People(21, "wujunmin"); // 创建一个对象
People p3 = new People(20, "muqing"); // 创建一个对象
People p4 = new People(23, "lupan"); // 创建一个对象
people.Add(p1); // 添加一个对象
people.Add(p2); // 添加一个对象
people.Add(p3); // 添加一个对象
people.Add(p4); // 添加一个对象
使用 Lambda 表达式进行筛选获取数据
3.1.1 筛选年龄大于20岁的人,需要从列表中筛选,示例代码如下。
IEnumerable<People> results = people.Where(delegate(People p) { return p.age > 20; }); // 匿名方法
IEnumerable<People> results = people.Where(People => People.age > 20); // Lambda 表达式
// Lambda 表达式:(参数列表) => 表达式或语句块(操作内容)
当编译器开始编译并运行时,Lambda 表达式最终也表现为 匿名方法。
使用 匿名方法 并不是创建了没有名称的方法,实际上 编译器会创建一个方法,这个方法对于开发人员来说是 不可见 的,该方法会 将 People 类的对象中符合 p.age > 20 的对象返回并填充到集合中。
相同地,使用 Lambda 表达式,当 编译器编译时,Lambda 表达式同样会被 编译成一个匿名方法 进行相应的操作,但是与匿名方法相比,Lambda 表达式更容易阅读。
3.1.2 Lambda 表达式参数
Lambda 表达式:(参数列表) => 表达式或语句块(表达式主体,也就是方法的操作内容)
(x, y) => x * y // 多参数,隐式类型 => 表达式
x => x * 5 // 单参数, 隐式类型 => 表达式
x => { return x * 5; } // 单参数,隐式类型 => 语句块
(int x) => x * 5 // 单参数,显式类型 => 表达式
(int x) => { return x * 5; } // 单参数,显式类型 => 语句块
() => Console.WriteLine() // 无参数
3.2 案例 (委托与 Lambda 的用法案例——递归)
定义三个委托:
private delegate void NullParam(); // 没有参数
private delegate void OneParam(int num); // 一个参数
private delegate int TwoParam(int num, string str); // 两个不同类型的参数
先实现第一个委托
private delegate void NullParam();
public static void NulParam() {
NullParam nullParam = () => { // 此操作可看作:(参数)=>{操作}
return "1"; // {}里便是实现委托所作的操作。
}; // 在这后便不属于实现委托的操作。
Console.WriteLine("我没有参数 返回值:{0}", nullParam());
}
在 Main() 方法里调用:
static void Main(String[] args) {
Program program = new Program();
program.NullParam();
}
结果是:
在这里需要注意:控制台返回的结果:1 并不是 nullParam() 返回的结果。
nullParam() 实现方法里返回了 n 值,但 n 值只是返回到 NulParam() 方法里,
并不是方法 NulParam() 的返回值,所以调用 NullParam() 方法无法得到返回的 n 值。
只有通过方法 NulParam() 方法的 Console 输出或者是变更方法类型,才能够将 n 值输出,但此时输出的 n 值不是直接从 NullParam() 方法里直接得到的了。
实现第二个委托
private delegate void OneParam(int num);
public void OnParam() {
OneParam oneParam = n => { Console.WriteLine(n); };
oneParam(5); // 此语句是调用上面已经实现的 n 的操作方法
}
在 Main() 方法里调用
static void Main(string[] args) {
Program program = new Program();
program.OnParam();
// Console.WriteLine(program.TwParam());
// program.TwParam();
Console.ReadKey();
}
结果是 5
实现第三个委托
private delegate int TwoParam(int num, string str);
public int TwParam() {
TwoParam twoParam = (n, s) => {
// Console.WriteLine(n);
return n; // 注意,这里的返回只能返回给外层的 TwParam() 方法调用。
};
Console.WriteLine(twoParam(3, "hhh"));
// 注意,此处的输出的 TwParam() 调用了上面方法后的输出,在 TwParam() 方法里调用 twoParam(3, "hhh") 方法,会自动得到一个返回值 — n.
return twoParam(3, "哈哈");
// 这里的 return 是把 twoParam(3,"哈哈") TwParam() 方法的值通过方法返回出去,
// 可通过调用 TwParam() 方法获取 m 值。
}
在 Main() 方法里调用
static void Main(string[] args) {
Program program = new Program();
// program.OnParam();
Console.WriteLine(program.TwParam());
// 此输出是将 TwParam() 方法中的输出和返回值全部输出
program.TwParam();
// 此语句只是调用了 TwParam() 方法并没有进行获取返回值
Console.ReadKey();
}
结果是:3
3//第一和第二个3从Console.WriteLine(program.TwParam());得到
3//第三个3从Console.ReadKey();得到