如何在IEnumerable上获取IEnumerable <t>扩展方法?</t>

时间:2011-08-04 15:13:04

标签: c# generics c#-4.0 ienumerable

我真的很喜欢使用IEnumerable扩展方法。

但有时我最终会得到一些只实现IEnumerable的集合,所以它们不可用。将集合转换为可以使用这些方法的表单的最简单方法是什么?

更一般地说,有人可以向我解释这两种类型之间的区别以及为什么这些方法存在于新IEnumerable中的历史背后的原因吗?

3 个答案:

答案 0 :(得分:11)

通常,使用Cast()OfType()。两者都将非泛型IEnumerable转换为具有指定元素类型的泛型{ - 不同之处在于它们如何转换每个元素。 Cast将转换每个元素,这意味着如果您要求它执行无法处理的转换,它会抛出异常。 OfType只是跳过不正确类型的元素。

有关详细信息,请参阅Edulinq blog post about these operators

至于两种类型之间的区别 - 非泛型类型在泛型之前存在,基本上,因此不是类型安全的; Current的{​​{1}}属性仅为IEnumerator而非特定类型。 (另外,object不会实现IDisposable,而IEnumerator则会这样做。)如果您不熟悉泛型,那么这里的答案很容易理解......

答案 1 :(得分:1)

要从IEnumerable转到IEnumerable<T>,您可以使用Cast<T>()OfType<T>

至于为什么有两个。自{1.0}起初以来IEnumerable已存在。尽管CLR内部支持类型集合,但它们未在C#(或VB.NET)中公开。因此,当它们被公开时,System.Collections.Generics名称空间被添加了IEnumerable<T>

答案 2 :(得分:-1)

IEnumerable命名空间的通用集合(包括System.Collections.Generic)添加到.NET Framework 2.0之前,IEnumerable<T>接口已存在。

您可以使用MakeGeneric()扩展方法将非泛型集合强制转换为通用集合:

public static class EnumerableExtensions
{
    public static IEnumerable<object> MakeGeneric(this IEnumerable nonGenericCollection)
    {
        return nonGeneric.Cast<object>();
    }
}