.NET C#中的Func、Predicate和Expression用法详解
2024-12-26
3
在 .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。 更新于:1天前赞一波!1
相关文章
- 5个高性能 .NET Core 图片处理库推荐
- ASP.NET如何将Views文件夹从项目分离
- C#13新特性 使用System.Threading.Lock简化线程同步
- .NET C# 读取编辑.AVIF图片文件
- .NET C# SkiaSharp读取.AVIF图片文件报错
- .NET开源ORM FreeSql常见问题和解决方法
- 微软于发布了.NET 9 Release Candidate 2 提高整体质量
- 分享5个开源的.NET Excel读写操作库
- ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构
- 如何从.NET Framework迁移到.NET Core或.NET 6/7?
- 如何优化ASP.NET Core应用的性能?
- 10款.NET开发中推荐的代码分析和质量工具
- .NET9 Blazor有哪些更新?
- 在Docker、Kubernetes环境下部署.NET应用的最佳实践
- .NET 游戏开发框架有哪些?
- PluginCore 基于 ASP.NET Core 的轻量级插件框架
- .NET C# EntityFramework(EF)连接SQLite代码示例
- Sylvan.Data.Excel 性能优异的开源.NET Excel数据读取库
- ASP.NET Core 中常用的内置中间件
- .NET9 F#有什么新特性?
文章评论
评论问答