2010-10-07 32 views
3

我一直认为,要满足能够使用Where()的要求,就是要实现IEnumerable对LINQ使用集合类的要求

但今天我的一个朋友问我一个问题,为什么他不能将Where()应用到SPUserCollection类的对象(它来自Sharepoint)。由于这个班级来自SPBaseCollection,它实现IEnumerable - 我预计一切都应该没问题。但事实并非如此。

任何想法,为什么?

回答

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成随后可以与正常LINQ功能中使用的IEnumerable<T>

在下面的例子中,你不能做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中的预泛型API时需要使用很多。

+0

哦,我知道这是明显的;-)谢谢。 – zerkms 2010-10-07 05:05:49

+0

是的,出于某种未知的原因,我认为LINQ自动为非泛型集合进行投射。 – zerkms 2010-10-07 05:14:54

+0

@zerkms是的,每当智能感知系统在没有扩展方法的情况下弹出,我都会感到惊讶。好东西,他们在航运图书馆包括'Cast'! – 2010-10-07 05:17:24