web-dev-qa-db-ja.com

IListまたはIEnumerableを配列に変換する最良の方法

結果のIListまたは結果のIEnumerableを生成できるHQLクエリがあります。

しかし、私が選択しているエンティティの配列を返すようにしたいのですが、それを達成する最良の方法は何でしょうか?列挙して配列を作成するか、定義済み配列のCopyTo()を使用できます。

より良い方法はありますか? CopyTo-approachを使用しました。

88
jishi

どのバージョンの.NETを使用していますか? .NET 3.5の場合は、ToArray()を呼び出して完了です。

非ジェネリックIEnumerableのみがある場合は、次のようなことを行います。

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

そのメソッド内の型がわからないが、メソッドの呼び出し元がそれを知っている場合は、メソッドをジェネリックにして、これを試してください:

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}
151
Jon Skeet

.csファイルに次を追加します。

using System.Linq;

その後、System.Linq.Enumerableから次の拡張メソッドを使用できます。

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

つまり.

IEnumerable<object> query = ...;
object[] bob = query.ToArray();
44
Michael Joyce

車輪を再発明したい気がします...

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}
6
Philippe Matray

Linqがない場合は、次の方法で解決しました。

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }

それが役に立てば幸い

2
Lug