繁体   English   中英

我如何获得我的IEnumerable <T> IEnumerable上的扩展方法?

[英]How do I get my IEnumerable<T> extension methods on an IEnumerable?

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

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

而且更笼统地说,有人可以向我确切解释这两种类型之间的区别是什么以及为什么对于较新的IEnumerable存在这些方法的历史吗?

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

有关更多信息,请参见有关这些运算符Edulinq博客文章

至于两种类型之间的区别-非泛型类型基本上在泛型之前存在,因此不是类型安全的; IEnumeratorCurrent属性只是object而不是特定类型。 (此外, IEnumerator并没有实现IDisposable,而IEnumerator<T>却实现了。)如果您是泛型的新手,那么这里的答案远远不止于此。

要将IEnumerable转换为IEnumerable<T> ,可以使用Cast<T>()OfType<T>

至于为什么有两个。 从最初的.NET 1.0天开始, IEnumerable就存在了。 尽管CLR内部支持类型化集合,但它们并未在C#(或VB.NET)中公开。 因此,当它们暴露给System.Collections.Generics命名空间时,它会添加IEnumerable<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM