这只是一个好奇心问题,我想知道是否有人对以下问题有一个好的答案:
在.NET Framework类库中,我们有例如以下两种方法:
public static IQueryable<TSource> Where<TSource>( this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate ) public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )
他们为什么使用Func<TSource, bool>代替Predicate<TSource>?似乎Predicate<TSource>仅由List<T>和使用Array<T>,而Func<TSource, bool>几乎所有Queryable和Enumerable方法以及扩展方法都使用… …这是怎么回事?
Func<TSource, bool>
Predicate<TSource>
List<T>
Array<T>
Queryable
Enumerable
虽然Predicate已经在同一时间被引入List<T>,并Array<T>在.NET 2.0中,不同的Func和Action变异都来自.NET 3.5。
Predicate
Func
Action
因此,这些Func谓词主要用于LINQ运算符中的一致性。作为.NET 3.5,有关使用的Func<T>和Action<T>的方针状态:
Func<T>
Action<T>
不要使用新的LINQ类型Func<>, Expression<>而不要使用自定义委托和谓词
Func<>
Expression<>