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

相关推荐
编程乐趣4 分钟前
C#实现图片文字识别
开发语言·c#
mengyoufengyu12 分钟前
python3:线程管理进程
开发语言·python
西猫雷婶29 分钟前
python学智能算法(十二)|机器学习朴素贝叶斯方法初步-拉普拉斯平滑计算条件概率
开发语言·人工智能·python·深度学习·机器学习·矩阵
future14121 小时前
FairyGUI学习
学习·游戏·ui·unity
是紫焅呢1 小时前
C函数基础.go
开发语言·后端·青少年编程·golang·学习方法·visual studio code
Chef_Chen1 小时前
从0开始学习R语言--Day27--空间自相关
学习
小白杨树树1 小时前
【JAVA】的SPI机制
java·开发语言·microsoft
虾球xz2 小时前
CppCon 2017 学习:10 Core Guidelines You Need to Start Using Now
开发语言·c++·学习
cainiao0806052 小时前
基于Python的气象数据分析及可视化研究
开发语言·python·数据分析
Q_Q19632884752 小时前
python大学校园旧物捐赠系统
开发语言·spring boot·python·django·flask·node.js·php