【问题标题】:Best way to convert an IEnumerable<T> to an T[]将 IEnumerable<T> 转换为 T[] 的最佳方法
【发布时间】:2010-10-04 14:51:57
【问题描述】:

从通用 IEnumerable&lt;T&gt; 实现转换为 T 数组的最佳方法是什么?我目前的解决方案如下所示:

IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();

通过List&lt;T&gt; 进行转移似乎没有必要,但我一直找不到更好的方法。

注意:我在这里使用 C# 2.0。

【问题讨论】:

  • 在 3.5 中你可以做 getFoo().ToArray(),但这对你没有多大帮助:)

标签: arrays collections .net-2.0 c#-2.0 ienumerable


【解决方案1】:

.NET 3.0 及更高版本:

IEnumerable&lt;T&gt; 上调用ToArray extension method,它的作用与下面几乎相同,执行类型嗅探和其他一些优化。

.NET 2.0 及之前版本:

一般来说,使用List&lt;T&gt; 将使用IEnumerable&lt;T&gt; 进行初始化,然后调用ToArray 可能是最简单的方法。

constructor for List&lt;T&gt; 将检查IEnumerable&lt;T&gt; 以查看它是否实现了ICollection&lt;T&gt; 以获取项目计数以正确初始化列表的容量。如果没有,它将正常扩展。

当然,您最终可能会创建多个List&lt;T&gt; 实例,只是为了将IEnumerable&lt;T&gt; 转换为T[]。为此,您可以编写自己的方法,但实际上您只是在复制 List&lt;T&gt; 中已经存在的代码。

【讨论】:

  • 是的。但是,如果您有来自其他来源的计数,而不是来自 IEnumerable 的其他接口(如 ICollection),您应该使用您的计数来自己创建一个数组。任何其他方式,通过列表可能是最好的。
【解决方案2】:

做一点 .NET Reflector 看起来 Linq ToArray 扩展方法基本上与通过 List 传递 IEnumerable 做同样的事情。 Buffer 类是内部的,但行为似乎与 List 非常相似。

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    Buffer<TSource> buffer = new Buffer<TSource>(source);
    return buffer.ToArray();
}

【讨论】:

    【解决方案3】:
    // src is IEnumerable<T>
    // target is T[]
    target = src == null ? new T[] {} : src.ToArray();
    

    【讨论】:

      【解决方案4】:

      如果无法确定数组的长度,那么这是最好的方法。

      IEnumerable 中没有任何内容可以让您确定长度,但也许您的代码有办法找出另一种方法。如果是这样,请使用它来构造一个数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2012-02-24
        • 2011-07-28
        • 2021-12-02
        相关资源
        最近更新 更多