.NET C#中的Func、Predicate和Expression用法详解
2024-12-25
403 0在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。
1. Func
Func 是一个通用委托,用于表示返回值类型的函数。可以有 0 到 16 个输入参数,最后一个类型参数是返回值的类型。
Func 基本语法
public delegate TResult Func<in T1, in T2, ..., out TResult>();
T1, T2... 是输入参数的类型。TResult 是返回值的类型。
Func 用法示例
无参数的 Func
Func<int> getRandomNumber = () => new Random().Next(1, 100);
Console.WriteLine(getRandomNumber()); // 输出随机数
一个输入参数
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出 25
多个输入参数
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 4)); // 输出 7
2. Predicate
Predicate<T> 是一个专门的委托,用于表示一个返回布尔值的函数,通常用来表示条件判断。
Predicate 基本语法
public delegate bool Predicate<in T>(T obj);
T 是输入参数的类型。返回值为 bool。
Predicate 用法示例
检查是否为偶数
Predicate<int> isEven = x => x % 2 == 0;
Console.WriteLine(isEven(4)); // 输出 True
Console.WriteLine(isEven(5)); // 输出 False
结合 List 使用
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.FindAll(x => x % 2 == 0);
Console.WriteLine(string.Join(", ", evenNumbers)); // 输出 2, 4
3. Expression
Expression<TDelegate> 表示一个表达式树,可以用来描述代码块的结构,而不是立即执行它。常用于 LINQ 和动态编译场景。
Expression 基本语法
public class Expression<TDelegate> : LambdaExpression
TDelegate 是委托类型,如 Func 或 Predicate。可以用于构建动态查询或生成代码。
Expression 用法示例
创建简单的表达式树
Expression<Func<int, int>> squareExpression = x => x * x;
Console.WriteLine(squareExpression); // 输出 x => (x * x)
编译并执行表达式树
var compiled = squareExpression.Compile();
Console.WriteLine(compiled(5)); // 输出 25
动态构建查询
Expression<Func<int, bool>> isEvenExpression = x => x % 2 == 0;
var compiledPredicate = isEvenExpression.Compile();
Console.WriteLine(compiledPredicate(4)); // 输出 True
Console.WriteLine(compiledPredicate(5)); // 输出 False
与 LINQ 一起使用
在 ORM(如 Entity Framework)中,Expression 是非常关键的,用于动态生成 SQL 查询。
Expression<Func<User, bool>> isActiveUser = user => user.IsActive;
var activeUsers = dbContext.Users.Where(isActiveUser).ToList();
比较和区别
总结
- Func 是最通用的委托类型,用于定义任何返回值的函数。
- Predicate 是 Func<T, bool> 的特殊形式,专门用于布尔值判断。
- Expression 不直接执行,而是用于描述代码结构,主要应用于 LINQ 和动态编译场景。
选择哪种工具取决于需求:
- 如果需要快速执行,使用 Func 或 Predicate。
- 如果需要动态生成或操作表达式,使用 Expression。
您可能感兴趣:
阿里云 云服务器 99元1年 2核2G 3M固定带宽 续费与新购同价
领取 通义灵码 免费使用资格 兼容 Visual Studio Code、Visual Studio、JetBrains IDEs 等主流编程工具, 为你提供高效、流畅、舒心的智能编码体验!