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

相关推荐
彤银浦5 分钟前
Web学习笔记2
笔记·学习
长风破浪会有时呀19 分钟前
Git 学习笔记
笔记·git·学习
偷偷的卷27 分钟前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
大白的编程日记.40 分钟前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
Chef_Chen43 分钟前
从0开始学习R语言--Day42--LM检验
学习
网小鱼的学习笔记43 分钟前
python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
开发语言·python·mongodb
C语言小火车1 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
Q_Q5110082851 小时前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
亮1111 小时前
Maven 编译过程中发生了 Java Heap Space 内存溢出(OutOfMemoryError)
java·开发语言·maven
Chef_Chen1 小时前
从0开始学习R语言--Day40--Kruskal-Wallis检验
开发语言·学习·r语言