8

ジェネリックIEnumerable<T>実装から T の配列に変換する最良の方法は何ですか? 私が持っている現在のソリューションは次のようになります。

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

を介した転送List<T>は不必要に思えますが、それを行うためのより良い方法を見つけることができませんでした.

注: ここでは C# 2.0 で作業しています。

4

4 に答える 4

15

.NET 3.0 以降:

ToArrayで拡張メソッドを呼び出しますIEnumerable<T>。これは、以下とほぼ同じことを行い、型スニッフィングとその他の最適化を実行します。

.NET 2.0 以前:

一般的に言えば、List<T>で初期化される a を使用してIEnumerable<T>から呼び出すのToArrayが、おそらくこれを行う最も簡単な方法です。

コンストラクターList<T>は、リストの容量を適切に初期化するためにアイテムの数を取得するためIEnumerable<T>に実装されているかどうかをチェックします。ICollection<T>そうでない場合は、通常どおり展開されます。

もちろん、List<T>に変換IEnumerable<T>するためだけに多数のインスタンスを作成することになる場合もありますT[]。そのために、独自のメソッドを作成できますが、実際にはList<T>既存のコードを複製するだけです。

于 2009-01-31T01:27:07.783 に答える
5

少し .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();
}
于 2009-02-02T12:24:08.503 に答える
0

配列の長さを決定する方法がない場合は、それが最善の方法です。

IEnumerable には長さを判断できるものは何もありませんが、コードには別の方法を見つける方法があるかもしれません。その場合は、それを使用して配列を作成します。

于 2009-01-31T01:25:46.553 に答える