我一直认为,如果能够使用Where()
来满足课程应该满足的要求就是实现IEnumerable
。
但今天我的一位朋友问我一个问题,为什么他不能将Where()
应用于SPUserCollection类的对象(来自Sharepoint)。由于此类派生自实现IEnumerable
的{{3}} - 我预计一切都应该没问题。但事实并非如此。
任何想法,为什么?
答案 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时,需要大量使用它。