IEnumerable
和IEnumerable<T>
类似。这是一个疏忽吗?或者当您没有指定类型时,是否存在问题,使得实现.Count()
,.Where()
等扩展功能不可能?
IEnumerable
和IEnumerable<T>
类似。这是一个疏忽吗?或者当您没有指定类型时,是否存在问题,使得实现.Count()
,.Where()
等扩展功能不可能?
IQueryable<T>
和 IEnumerable<T>
的方法需要知道项目的类型。显然,像 Count()
或 Any()
这样的方法可以在非泛型接口上工作,但这可能会令人困惑。因此,适用于非泛型接口的唯一方法是使它们成为泛型接口(Cast<T>()
和 OfType<T>()
)。这可能是一个有意的决定而不是疏忽,因为可以使用Cast
方法将IEnumerable\IQueryable
始终转换为IEnumerable\IQueryable<object>
。
这会给调用者带来一些小的开销,但可以避免重复实现许多扩展,例如对于Where
,您需要一个泛型和非泛型版本:
public static IEnumerable Where(this IEnumerable source, Func<object, bool> predicate) { ... }
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... }
Cast<T>
:) - MarcinJuraszekIEnumerable<T>
继承了IEnumerable
方法,这些方法不需要直接类型知识(例如Count()
,Any()
),可以在IEnumerable
上实现,而其余的方法(例如Where(pred)
,Select(func)
等)则在IEnumerable<T>
上实现。 - MarcinJuraszekCount
,但大多数 Linq 扩展都可以在IEnumerable
上实现,对于这些扩展,您必须实现两次。 - LeeIEnumerable
上缺少Linq扩展是否是一个疏忽。我认为这可能是故意的,因为为IEnumerable\IQueryable
的非泛型版本再次实现大多数方法并没有显著的好处。 - Lee