从通用IEnumerable<T>
实现转换为 T 数组的最佳方法是什么?我目前的解决方案如下所示:
IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();
通过 a 转移List<T>
似乎是不必要的,但我一直无法找到更好的方法来做到这一点。
注意:我在这里使用 C# 2.0。
从通用IEnumerable<T>
实现转换为 T 数组的最佳方法是什么?我目前的解决方案如下所示:
IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();
通过 a 转移List<T>
似乎是不必要的,但我一直无法找到更好的方法来做到这一点。
注意:我在这里使用 C# 2.0。
调用onToArray
扩展方法IEnumerable<T>
,它的作用与下面几乎相同,执行类型嗅探和其他一些优化。
一般来说,使用 a List<T>
which 将被初始化,IEnumerable<T>
然后调用ToArray
可能是最简单的方法。
for的构造函数List<T>
将检查IEnumerable<T>
它是否实现ICollection<T>
了获取项目计数以正确初始化列表的容量。如果没有,它将正常扩展。
当然,您最终可能List<T>
只是为了转换IEnumerable<T>
为T[]
. 为此,您可以编写自己的方法,但实际上您只是在复制List<T>
已经存在的代码。
做一点 .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();
}
// src is IEnumerable<T>
// target is T[]
target = src == null ? new T[] {} : src.ToArray();
如果无法确定数组的长度,那么这是最好的方法。
IEnumerable 中没有任何内容可以让您确定长度,但也许您的代码有办法找出另一种方法。如果是这样,请使用它来构造一个数组。