LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# .NET中的Func、Predicate和Expression详解

admin
2024年11月7日 8:57 本文热度 382

在C# .NET中,Func、Predicate和Expression是三种常用的委托和表达式类型,它们在编写灵活、可重用的代码时非常有用。本文将详细介绍这三种类型,并提供多个实例来说明它们的用法和区别。

1. Func<T, TResult>

Func是一个通用委托,它可以接受零个或多个输入参数,并返回一个值。其基本形式为:

public delegate TResult Func<out TResult>();public delegate TResult Func<in T, out TResult>(T arg);public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);// ... 最多可以有16个输入参数

示例1:基本用法

Func<int, int, string> formatNumber = (a, b) => $"The sum of {a} and {b} is {a + b}";string result = formatNumber(5, 3);Console.WriteLine(result); 

示例2:作为方法参数

public static List<int> FilterList(List<int> numbers, Func<int, bool> filterFunc){    return numbers.Where(filterFunc).ToList();}
static void Main(string[] args){    // 使用    List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    List<int> evenNumbers = FilterList(numbers, n => n % 2 == 0);    Console.WriteLine(string.Join(", ", evenNumbers));}

2. Predicate<T>

Predicate是一个特殊的Func,它始终返回一个布尔值。它通常用于定义过滤条件。

public delegate bool Predicate<in T>(T obj);

示例3:使用Predicate

static void Main(string[] args){    List<string> fruits = new List<string> { "apple", "banana", "cherry", "date", "elderberry" };
   Predicate<string> startsWithB = s => s.StartsWith("b", StringComparison.OrdinalIgnoreCase);    string bFruit = fruits.Find(startsWithB);
   Console.WriteLine(bFruit);}

示例4:Predicate vs Func

static void Main(string[] args){    // 使用Predicate    Predicate<int> isEven = n => n % 2 == 0;    List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    List<int> evenNumbers = numbers.FindAll(isEven);
   // 使用Func    Func<int, bool> isOdd = n => n % 2 != 0;    List<int> oddNumbers = numbers.Where(isOdd).ToList();
   Console.WriteLine($"Even numbers: {string.Join(", ", evenNumbers)}");    Console.WriteLine($"Odd numbers: {string.Join(", ", oddNumbers)}");}

3. Expression<T>

Expression表示一个可以编译和执行的代码块。它们通常用于构建动态查询、规则引擎或者在运行时修改代码行为。

示例5:基本Expression

static void Main(string[] args){    Expression<Func<int, bool>> isPositive = n => n > 0;
   // 编译并执行Expression    Func<int, bool> compiledFunc = isPositive.Compile();    bool result = compiledFunc(5);    Console.WriteLine(result);}

示例6:构建动态查询

public class Person{    public string Name { get; set; }    public int Age { get; set; }}
public static Expression<Func<Person, bool>> BuildAgeRangeExpression(int minAge, int maxAge){    ParameterExpression parameter = Expression.Parameter(typeof(Person), "p");    Expression left = Expression.Property(parameter, "Age");    Expression minAgeCheck = Expression.GreaterThanOrEqual(left, Expression.Constant(minAge));    Expression maxAgeCheck = Expression.LessThanOrEqual(left, Expression.Constant(maxAge));    Expression combinedCheck = Expression.AndAlso(minAgeCheck, maxAgeCheck);
   return Expression.Lambda<Func<Person, bool>>(combinedCheck, parameter);}
static void Main(string[] args){    // 使用    List<Person> people = new List<Person>    {        new Person { Name = "Alice", Age = 25 },        new Person { Name = "Bob", Age = 30 },        new Person { Name = "Charlie", Age = 35 },        new Person { Name = "David", Age = 40 }    };
   var ageRangeExpression = BuildAgeRangeExpression(28, 38);    var filteredPeople = people.AsQueryable().Where(ageRangeExpression);
   foreach (var person in filteredPeople)    {        Console.WriteLine($"{person.Name} - {person.Age}");    }}

总结

  1. Func<T, TResult> 是一个通用委托,可以接受多个输入参数并返回一个值。它非常灵活,适用于多种场景。

  2. Predicate<T> 是Func的一个特例,专门用于返回布尔值的情况。它通常用于定义过滤条件。

  3. Expression<T> 表示可编译和执行的代码块。它允许在运行时检查、修改和编译代码,特别适用于构建动态查询和规则引擎。


这三种类型在C# .NET编程中扮演着重要角色,能够帮助开发者编写更加灵活、可重用和高效的代码。根据具体的使用场景,选择合适的类型可以大大提高代码的表现力和可维护性。


该文章在 2024/11/7 10:27:20 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved