要与LINQ一起使用的集合类的要求

时间:2010-10-07 04:52:34

标签: .net linq sharepoint ienumerable

我一直认为,如果能够使用Where()来满足课程应该满足的要求就是实现IEnumerable

但今天我的一位朋友问我一个问题,为什么他不能将Where()应用于SPUserCollection类的对象(来自Sharepoint)。由于此类派生自实现IEnumerable的{​​{3}} - 我预计一切都应该没问题。但事实并非如此。

任何想法,为什么?

1 个答案:

答案 0 :(得分:3)

LINQ扩展方法是在IEnumerable<T>而非IEnumerable上定义的。例如,请参阅Where<T>签名:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

为了缓解此问题,LINQ Cast<T>扩展方法将IEnumerable转换为IEnumerable<T>,然后可以与普通的LINQ函数一起使用。

在下面的示例中,您无法e.Where(...),但可以Cast,然后使用Where

int[] xs = new[] { 1, 2, 3, 4 };
IEnumerable e = xs;
var odds = e.Cast<int>().Where(x => x % 2 == 1);

不幸的是,在.NET BCL中处理pre-generics API时,需要大量使用它。