惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
H
Heimdal Security Blog
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Schneier on Security
G
GRAHAM CLULEY
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
C
Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Jina AI
Jina AI
P
Proofpoint News Feed
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
S
Security Affairs
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
N
News | PayPal Newsroom
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU

极客蜂巢

软件评测师-虚拟存储体系练习题 - 极客蜂巢 基于.Net Framework471搭建的WebAPI简单框架(下) - 极客蜂巢 Redis解析(个人见解)(2) - 极客蜂巢 exploring-the-phenomenon-of-ubereats-clone-a-comprehensive-guide - 极客蜂巢 Revolutionizing Dining: The Power and Potential of Food Ordering Systems Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题 - 极客蜂巢 【转载】有趣的小玩意-原神,启动! - 极客蜂巢 【转载】Docker部署trwebocr | 自建一个文字识别服务 - 极客蜂巢 CDN使用教程 - 极客蜂巢 关于 winFrom DevExpress22.2 使用自适应组件LayoutControl的一些踩坑指南 - 极客蜂巢 Java开源项目浪海博客系统 - 极客蜂巢
Lambda介绍与案例分析 - 极客蜂巢
Jackson.Yeun · 2024-02-09 · via 极客蜂巢

1.结构组成图

(参数) =>{操作}

071029218154227.png

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

结果是:image-20200325184942012

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