![](/img/trans.png)
[英]How to get the IQueryable<T> extension methods instead of the IEnumerable<T> extensions?
[英]How do I get my IEnumerable<T> extension methods on an IEnumerable?
我真的很喜欢使用IEnumerable扩展方法。
但是有时我最终会得到一些仅实现IEnumerable的集合,因此它们不可用。 将集合转换为可以使用这些方法的表单的最简单方法是什么?
而且更笼统地说,有人可以向我确切解释这两种类型之间的区别是什么以及为什么对于较新的IEnumerable存在这些方法的历史吗?
通常,使用Cast()
或OfType()
。 两者都将非通用IEnumerable
转换为具有指定元素类型的通用IEnumerable
区别在于它们如何转换每个元素。 Cast
将转换每个元素,这意味着如果您要求它执行无法处理的转换,它将抛出异常。 OfType
只是跳过不正确类型的元素。
有关更多信息,请参见有关这些运算符的Edulinq博客文章 。
至于两种类型之间的区别-非泛型类型基本上在泛型之前存在,因此不是类型安全的; IEnumerator
的Current
属性只是object
而不是特定类型。 (此外, IEnumerator
并没有实现IDisposable,而IEnumerator<T>
却实现了。)如果您是泛型的新手,那么这里的答案远远不止于此。
在将System.Collections.Generic
命名空间的通用集合(包括IEnumerable<T>
)添加到.NET Framework 2.0之前,已经存在IEnumerable
接口。
您可以使用MakeGeneric()
扩展方法将非通用集合转换为通用集合:
public static class EnumerableExtensions
{
public static IEnumerable<object> MakeGeneric(this IEnumerable nonGenericCollection)
{
return nonGeneric.Cast<object>();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.