C#中的Predicate与Func

C#有很多语法糖,有时使用时会觉得模棱两可,
以前很少用Predicate,因为英文太长,不如Func实在,
在我感觉中,这两个本该就是同一个东西。
但你会发现:
(1)List类的所有方法如Exists, Find, FindAll, FindIndex等全是接受Predicate类型参数的。
(2)而List类实现的接口IEnumerable的所有扩展方法如All,Any,First,FirstOrDefault,Where等都是接受Func<TSource, bool>类型的参数的。

同样是List中的方法,为什么会使用不同的委托类型呢?
先看一下定义:

Func<T, bool> :表示有传入T类型的参数,返回值为bool的委托
Predicate:表示有传入T类型的参数,返回值为bool的委托

在定义上不存在任何差别。
查看Predicate和Func的定义如下:

public delegate bool Predicate<in T>(T obj);
public delegate TResult Func<in T, out TResult>(T arg);

当Func定义中TResult固定为bool,则两个定义应该是完全一致,
List中的方法参数本应该统一才对。
是微软豆逼了么,一定要写成不一样的?谁能告诉我为什么!

下面验证一下:

	1.     static void Main(string[] args)  
	2.         {  
	3.             Predicate<int> myPredicate = i => i > 10;  
	4.             Func<int, bool> myFunc = i => i > 10;  
	5.             List<int> list = new List<int>();  
	6.             list.Add(5);  
	7.             list.Add(9);  
	8.             list.Add(20);  
	9.             list.Add(30);  
	10.             List<int> newList = list.FindAll(myPredicate);  
	11.             List<int> newListFunc = list.Where(myFunc).ToList();  
	12.             Console.ReadKey();  
	13.         }

可以看到Predicate和Func接受的是完全相同的Lambada表达式,
而且执行结果newList和newListFunc完全相同。
此时用F12打开Where的定义就可以看到如下代码:

//
// 摘要:
// 基于谓词筛选值序列。
//
// 参数:
// source:
// 要筛选的 System.Collections.Generic.IEnumerable`1。
//
// predicate:
// 用于测试每个元素是否满足条件的函数。
//
// 类型参数:
// TSource:
// source 中的元素的类型。
//
// 返回结果:
// 一个 System.Collections.Generic.IEnumerable`1,包含输入序列中满足条件的元素。
//
// 异常:
// T:System.ArgumentNullException:
// source 或 predicate 为 null。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

由扩展函数Where的参数定义【Func<TSource, bool> predicate】可见,
Func<TSource, bool> 即predicate,微软就是这么定义的。

结论:
Func<T, bool>是对delegate bool Predicate(T obj)的简化,
Predicate又是对Func<T, bool>的简化,

其实,就是一个东西。
List中的方法应该统一参数。

附上以下内容:
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。这个是祖宗。
Func可以接受0个至16个传入参数,必须具有返回值。
Action可以接受0个至16个传入参数,无返回值。
Predicate只能接受一个传入参数,返回值为bool类型。

From:https://blog.csdn.net/rye_grass/article/details/66041423

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值