如何将通用的 IEnumerable<T>
实现转换为 T 类型的数组?目前我有如下解决方案:
IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();
通过 List<T>
进行传输似乎是不必要的,但我还没有找到更好的方法。
注意:这里我正在使用 C# 2.0。
如何将通用的 IEnumerable<T>
实现转换为 T 类型的数组?目前我有如下解决方案:
IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();
通过 List<T>
进行传输似乎是不必要的,但我还没有找到更好的方法。
注意:这里我正在使用 C# 2.0。
在IEnumerable<T>
上调用ToArray
扩展方法,它执行类型嗅探和其他一些优化,实现几乎与下面相同的功能。
通常来说,使用一个List<T>
,并用IEnumerable<T>
初始化它,然后调用ToArray
可能是最简单的方法。
List<T>
的构造函数会检查IEnumerable<T>
是否实现了ICollection<T>
以获取项目计数,以正确初始化列表容量。如果没有,则会像平常一样进行扩展。
当然,您可能会因为将IEnumerable<T>
转换为T[]
而创建许多List<T>
实例。为此,您可以编写自己的方法,但实际上只是重复了已经存在于List<T>
中的代码。
通过使用.NET Reflector,看起来Linq ToArray扩展方法基本上与将IEnumerable传递到List<>中做的事情相同。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();