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

Sco*_*sen 8 arrays collections ienumerable .net-2.0 c#-2.0

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

IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();
Run Code Online (Sandbox Code Playgroud)

通过一个List<T>似乎不必要的转移,但我还没有找到一个更好的方法来做到这一点.

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

cas*_*One 14

.NET 3.0及之后:

调用ToArray扩展方法IEnumerable<T>,它几乎与下面相同的,执行型嗅探和其他一些优化.

.NET 2.0及之前版本:

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

用于构造List<T>将检查IEnumerable<T>,看它是否实现ICollection<T>获得项目数正确初始化列表的能力.如果没有,它将正常扩展.

当然,您可能最终List<T>只是为了转换IEnumerable<T>而创建了许多实例T[].为此,您可以编写自己的方法,但实际上只是复制List<T>已存在的代码.


Rob*_*ady 5

做一点.NET反射器看起来像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();
}
Run Code Online (Sandbox Code Playgroud)