跟着AI学习C# Day14

📅 Day 14:Lambda 表达式与表达式树(Expression Trees)

✅ 学习目标:

  • 理解 Lambda 表达式的概念与作用;
  • 掌握 Lambda 表达式的语法结构;
  • 能够将 Lambda 表达式用于 LINQ 查询、委托、事件等;
  • 理解表达式树的基本原理及其在 EF Core 中的应用;
  • 能够动态构建表达式树并编译执行;
  • 编写一个结合 Lambda 表达式和表达式树的程序。

🔥 一、Lambda 表达式(Lambda Expressions)

💡 什么是 Lambda 表达式?

Lambda 表达式 是一种简洁地表示匿名函数的方式。它可以用一行代码定义一个方法,并作为参数传递给其他方法(如 LINQ 查询中的 WhereSelect 等),也可以赋值给 ActionFunc 委托。


🧩 语法格式:

复制代码
(参数列表) => 表达式或语句块
类型 示例
无参无返回值 () => Console.WriteLine("Hello")
有参无返回值 x => Console.WriteLine(x)
有参有返回值 (a, b) => a + b

📌 示例 1:基本用法

csharp 复制代码
// 使用 Func 委托
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出:25

// 使用 Action 委托
Action<string> greet = name => Console.WriteLine($"你好,{name}!");
greet("小明");

📌 示例 2:多语句 Lambda(使用大括号)

csharp 复制代码
Func<int, int, string> compare = (a, b) =>
{
    if (a > b)
        return "a 大于 b";
    else if (a < b)
        return "a 小于 b";
    else
        return "a 等于 b";
};

Console.WriteLine(compare(5, 3)); // 输出:a 大于 b

📌 示例 3:在 LINQ 中使用 Lambda

csharp 复制代码
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (int n in evenNumbers)
{
    Console.WriteLine(n); // 输出:2, 4
}

🧱 二、表达式树(Expression Trees)

💡 什么是表达式树?

表达式树(Expression Tree) 是以树状数据结构来表示 C# 代码的一种方式。它不是直接编译成 IL 代码运行,而是保留代码结构信息,便于分析、转换或生成 SQL 查询(如 Entity Framework)。


📌 示例 1:创建表达式树

csharp 复制代码
// 创建一个表达式树,表示 x => x * x
Expression<Func<int, int>> expr = x => x * x;

Console.WriteLine(expr); // 输出:x => (x * x)

📌 示例 2:编译并执行表达式树

csharp 复制代码
Expression<Func<int, int>> expr = x => x * x;

Func<int, int> func = expr.Compile(); // 编译为可执行的委托
Console.WriteLine(func(5)); // 输出:25

📌 示例 3:手动构建表达式树(进阶)

csharp 复制代码
ParameterExpression param = Expression.Parameter(typeof(int), "x");
BinaryExpression body = Expression.Multiply(param, param);
Expression<Func<int, int>> expr = Expression.Lambda<Func<int, int>>(body, param);

Func<int, int> func = expr.Compile();
Console.WriteLine(func(6)); // 输出:36

💪 实战练习

✅ 练习 1:使用 Lambda 表达式筛选学生信息

功能要求:
  • 定义一个学生类;
  • 使用 Lambda 结合 LINQ 过滤出成绩大于 90 分的学生;
  • 按姓名排序后输出。
csharp 复制代码
class Student
{
    public string Name { get; set; }
    public int Score { get; set; }
}

List<Student> students = new List<Student>
{
    new Student { Name = "张三", Score = 85 },
    new Student { Name = "李四", Score = 92 },
    new Student { Name = "王五", Score = 97 },
    new Student { Name = "赵六", Score = 88 }
};

var highScorers = students
    .Where(s => s.Score > 90)
    .OrderBy(s => s.Name);

foreach (var s in highScorers)
{
    Console.WriteLine($"{s.Name} - 成绩:{s.Score}");
}

✅ 练习 2:构建一个简单的表达式计算器

功能要求:
  • 输入两个数和一个运算符(+、-、*、/);
  • 使用表达式树动态构建计算逻辑;
  • 输出结果。
csharp 复制代码
string op = "+"; // 用户输入的操作符
int a = 10, b = 5;

ParameterExpression paramA = Expression.Constant(a);
ParameterExpression paramB = Expression.Constant(b);

Expression resultExpr = op switch
{
    "+" => Expression.Add(paramA, paramB),
    "-" => Expression.Subtract(paramA, paramB),
    "*" => Expression.Multiply(paramA, paramB),
    "/" => Expression.Divide(paramA, paramB),
    _ => throw new InvalidOperationException()
};

Expression<Func<int>> lambda = Expression.Lambda<Func<int>>(resultExpr);
Func<int> func = lambda.Compile();

Console.WriteLine("结果:" + func()); // 输出:15

📝 小结

今天你学会了:

  • 使用 Lambda 表达式 简化委托和 LINQ 查询;
  • 掌握了 Lambda 表达式的多种写法(单语句、多语句、带返回值);
  • 理解了 表达式树(Expression Trees) 的作用和基本用法;
  • 能够手动构建表达式树,并将其编译为可执行代码;
  • 编写了多个实用程序,如学生筛选器、表达式计算器等。

Lambda 表达式是现代 C# 开发的核心工具之一,而表达式树则为你打开了通往高级编程的大门!


🧩 下一步学习方向(Day 15)

明天我们将进入一个新的主题 ------ LINQ to SQL 与 Entity Framework 基础,你将学会如何使用 LINQ 查询数据库,实现数据的增删改查操作。

相关推荐
JuneXcy22 分钟前
循环高级(2)
开发语言·c++·算法
小白学大数据25 分钟前
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
开发语言·分布式·爬虫·python·scrapy
請你喝杯Java2 小时前
【工具类】得到多个数组中的相同元素
开发语言·javascript
CodeCraft Studio6 小时前
PPT处理控件Aspose.Slides教程:在 C# 中将 PPTX 转换为 Markdown
开发语言·c#·powerpoint·markdown·ppt·aspose·ai大模型
wyn200011286 小时前
KafKa学习笔记
笔记·学习·kafka
萧鼎7 小时前
深入理解 Python Scapy 库:网络安全与协议分析的瑞士军刀
开发语言·python·web安全
IT90909 小时前
C#软件授权注册码模块源码及机器码注册码功能
c#·软件开发
阿拉丁的梦9 小时前
教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)
开发语言·python
木宇(记得热爱生活)9 小时前
一键搭建开发环境:制作bash shell脚本
开发语言·bash
Cisyam^9 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang