3
我一直认为,要满足能够使用Where()
的要求,就是要实现IEnumerable
。对LINQ使用集合类的要求
但今天我的一个朋友问我一个问题,为什么他不能将Where()
应用到SPUserCollection类的对象(它来自Sharepoint)。由于这个班级来自SPBaseCollection,它实现IEnumerable
- 我预计一切都应该没问题。但事实并非如此。
任何想法,为什么?
我一直认为,要满足能够使用Where()
的要求,就是要实现IEnumerable
。对LINQ使用集合类的要求
但今天我的一个朋友问我一个问题,为什么他不能将Where()
应用到SPUserCollection类的对象(它来自Sharepoint)。由于这个班级来自SPBaseCollection,它实现IEnumerable
- 我预计一切都应该没问题。但事实并非如此。
任何想法,为什么?
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时需要使用很多。
哦,我知道这是明显的;-)谢谢。 – zerkms 2010-10-07 05:05:49
是的,出于某种未知的原因,我认为LINQ自动为非泛型集合进行投射。 – zerkms 2010-10-07 05:14:54
@zerkms是的,每当智能感知系统在没有扩展方法的情况下弹出,我都会感到惊讶。好东西,他们在航运图书馆包括'Cast'! – 2010-10-07 05:17:24