首页 编程语言 正文
  • 本文约3339字,阅读需17分钟
  • 503
  • 0

Lambda介绍与案例分析

摘要

1.结构组成图 (参数) = {操作} 2.Lambda表示式 Lambda表达式一种可用于创建委托或表达式目录树的匿名函数。 一种高效的类似于函数式编程的表达式。 Lambda简化了开发中需要编写的代码量。 Lambda 表达式可以包含表达式和语句。 所有Lambda表达式都使用Lambda运算符= ,该运算符读作goes to。 Lambda运算符的左....

1.结构组成图

(参数) =>{操作}

Lambda介绍与案例分析

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

PSLambda 表达式是由 .NET 2.0 演化而来的,也是 LINQ 的基础,熟练地掌握 Lambda 表达式能够快速地上手 LINQ 应用开发。

Lambda 表达式在一定程度上就是 匿名方法另一种表现形式

3. 案例

3.1 Lambda 与 Linq 的使用

C# Lambda 表达式

先创建一个对象类

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 的用法案例——递归)

C# 之 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();
}

结果是:Lambda介绍与案例分析

在这里需要注意:控制台返回的结果: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();得到

友情链接