将IEnumerable <t>转换为T [] </t>的最佳方法

时间:2009-01-31 01:18:38

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

从通用IEnumerable<T>实现转换为T数组的最佳方法是什么?我目前的解决方案如下:

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

通过List<T>传输似乎是不必要的,但我找不到更好的方法来做到这一点。

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

4 个答案:

答案 0 :(得分:14)

.NET 3.0及之后:

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

.NET 2.0及之前:

一般来说,使用List<T>初始化IEnumerable<T>,然后调用ToArray可能是最简单的方法。

constructor for List<T>会检查IEnumerable<T>以查看它是否实施ICollection<T>以获取正确初始化列表容量的项目数。如果没有,它将正常扩展。

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

答案 1 :(得分:5)

做一点.NET反射器看起来Linq ToArray扩展方法基本上和通过List&lt;&gt;传递IEnumerable一样。 Buffer类是内部的,但行为似乎与List&lt;&gt;非常相似。

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();
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

// src is IEnumerable<T>
// target is T[]
target = src == null ? new T[] {} : src.ToArray();