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

相关推荐
。TAT。19 小时前
C++ - 多态
开发语言·c++·学习·1024程序员节
武当豆豆19 小时前
C++编程学习(第42天)
开发语言·c++·学习
yong999020 小时前
基于MATLAB的内容图像检索实现
开发语言·matlab
歪歪10020 小时前
在C#中详细介绍一下Visual Studio中如何使用数据可视化工具
开发语言·前端·c#·visual studio code·visual studio·1024程序员节
Eiceblue20 小时前
如何通过 C# 高效读写 Excel 工作表
c#·visual studio·1024程序员节
张人玉20 小时前
WPF 触发器详解:定义、种类与示例
c#·wpf·1024程序员节·布局控件
凉虾皮20 小时前
2024包河初中组
学习·算法·1024程序员节
jdlxx_dongfangxing20 小时前
C++ STL 容器与算法详解
开发语言·c++·1024程序员节
明道源码20 小时前
Kotlin 控制流、函数、Lambda、高阶函数
android·开发语言·kotlin
橙子1991101620 小时前
在 Kotlin 中,ViewModel 的获取
开发语言·vue.js·kotlin