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


98

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

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

もっと良い方法はありますか?私はCopyToアプローチを採用しました。


4
誰かがLinq なしで解決策持っていますか?
Bitterblue

回答:


166

どのバージョンの.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;
}

それは3.5ですが、IQueryにはToArrayも、IEnumerableやIListも、私が知る限りではありませんか?
jishi 2008年

2
いいえ-拡張メソッドは1つだけです。(インターフェース自体にはありません。)
Jon Skeet

3
@Shimmy:はい、あります...他に何があるかは別にして、それはコンパイラにどのような配列を期待するかを伝えています!object[]ちょうど使用したい場合Cast<object>。非ジェネリックにIEnumerableToArray拡張メソッドがないため、単に呼び出しfoo.ToArray<object>たり、そのようなことはできません。
Jon Skeet、2010

22
ToArray拡張メソッドは、であるSystem.Linq、名前空間、それが:)を知ってもいいかもしれないと思いました。
Tomas Jansson

1
@Alexander:本当に返される値がない場合を除きある適切な配列。
Jon Skeet、2015

47

以下を.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();

ahh ...単体テストプロジェクトには、デフォルトでlinqは含まれていません。ありがとうございました!
zsf222 2015年

6

車輪を再発明したい...

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

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

あなたはあなたの答えを説明できますか、そしてあなたがあなたが車輪を再発明しているように感じているとあなたが何を意味しているのですか?
ChrisCamp 2013

heh-私は実際にはこのようなものです:列挙型が実際には配列である場合、ToArray()呼び出しのステップへの新しい割り当て/コピーをスキップします(内部Bufferクラス経由)...誰かが「標準「コピー動作、彼らはかなり驚かれることでしょう。
JerKimball 2013

@Chris:System.LinqのToArray()メソッドのシグネチャに触発されたからです。msdn.microsoft.com/en-us/library/bb298736.aspx
Philippe Matray 2013年

ばかげている追加のこのメソッドの実装を呼び出す必要がありますIEnumerable.ToArray()
マフィンマン

2

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

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

        iList.CopyTo(result, 0);

        return result;
    }

それが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.