跟着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 查询数据库,实现数据的增删改查操作。

相关推荐
菜鸟‍8 分钟前
【论文学习】MICCAI 2024 || SGSeg:通过自引导机制实现胸部X光片语言引导分割的无文本推理
人工智能·深度学习·学习
lazy H10 分钟前
Git clone 怎么用?克隆项目及常见问题完整教程
大数据·git·后端·学习·搜索引擎·github
菜鸟‍14 分钟前
【论文学习】arxiv 2024 || RoSIS:基于鲁棒框架重新审视文本提示式手术器械分割
人工智能·学习·计算机视觉
颜x小40 分钟前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_423652131 小时前
C#使用JObject
开发语言·c#
国科安芯1 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
笨鸟先飞的橘猫2 小时前
只会脚本语言的游戏后端自我提升之路——c++学习(开篇)
学习·游戏
霸道流氓气质2 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
绿浪19843 小时前
async/await 深入学习
学习
BerrySen1783 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构