C# Func<;TObject,bool>;或谓词<;TObject>;?

C# Func<;TObject,bool>;或谓词<;TObject>;?,c#,linq,delegates,lambda,C#,Linq,Delegates,Lambda,我一次又一次地看到API(特别是在.NET框架中)使用Func,而Predicate似乎是一个完全负责任的选项。API设计人员这样做有什么好的理由?与LINQ的其他部分保持一致 (已经注意到了“异常”,但是对于匿名委托和lambda函数,它没有什么区别,因此几乎不需要注意这种区别。)Func委托是指定lambda/delegate到方法的“新”方式。但是,只有一组方便的委托,如果有一个更具体的委托做同样的事情,那么就这样做 在您的示例中,我总是选择谓词,因为它更具有自文档性(假设谓词是您想要的)

我一次又一次地看到API(特别是在.NET框架中)使用
Func
,而
Predicate
似乎是一个完全负责任的选项。API设计人员这样做有什么好的理由?

与LINQ的其他部分保持一致

(已经注意到了“异常”,但是对于匿名委托和lambda函数,它没有什么区别,因此几乎不需要注意这种区别。)

Func委托是指定lambda/delegate到方法的“新”方式。但是,只有一组方便的委托,如果有一个更具体的委托做同样的事情,那么就这样做

在您的示例中,我总是选择谓词,因为它更具有自文档性(假设谓词是您想要的)

在LINQ中,
Func
用于
Where
,以便采用索引和元素的其他重载是一致的:

IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
IEnumerable其中(IEnumerable源,Func谓词)
IEnumerable其中(IEnumerable源,Func谓词)

我个人认为,
谓词的名称
更具描述性,因此我会在不存在上述一致性问题的情况下使用它。请注意,只需要了解
操作
函数
委托类型就可以了。

我也不认为与LINQ其余部分的“一致性”是一个很好的理由。关于一种可能性,请参见Jon的答案。是的,我担心答案不会比这更好。这就像某种代码官僚机构赢得了纯洁的一面。(即,尽管存在一致性,仍应始终使用谓词)。