2009-06-07 24 views
15

IEnumerableをリストにキャストすることが可能かどうか疑問に思っていました。各項目をリストにコピーする以外の方法はありますか?IEnumerableをにキャストする<T>

答えて

26

すでに提案したように、yourEnumerable.ToList()を使用してください。 IEnumerableを列挙し、内容を新しいListに格納します。 IEnumerableが遅延要素を生成している可能性があるため、必ずしも既存のリストをコピーしているとは限りません。

これはまさに他の答えが示唆しているものですが、より明確です。

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return new List<TSource>(source); 
} 
+0

IEnumerableがnullではなく空の場合はエラーをスローしますか? –

24

.ToList()メソッドを使用します。

yourEnumerable.ToList(); 
+1

をSystem.Linqのを使用して利用できない場合は、:)がありません。これは完全に受け入れられた答えでなければなりません... – CodingYourLife

0

いいえ、あなたは参照がリストへの参照であることを確信している場合、あなたは

このような
List<int> intsList = enumIntList as List<int>; 
+5

あなたが間違っていると例外をスローするように、それはリストへの参照です。あなたがそれが*リスト* であるかもしれないと思うならば "as"を使ってください。あなたは確信がありませんし、どちらもエラー条件ではありません。次に、結果がnullかどうかをテストします。 –

+0

「if(intsList == null)intsList = new List (enumIntList);」を追加することがあります。もしそれが*リスト* であれば、既にあるが、そうでない場合もある。 – jerryjvl

1

を変換することができ、コピーする必要があり、新たなリストを作成し、その初期化子に古いのIEnumerableを渡します。

IEnumerable<int> enumerable = GetIEnumerable<T>(); 
    List<int> list = new List<int>(enumerable); 
+0

それもリストをコピーしています.. –

+0

とにかくコピーが必要です。 – Shimmy

3

他の人が示唆したように、単に列挙オブジェクト上ToList()メソッドを使用します:あなたのIEnumerableオブジェクトはToList()メソッドを持っていない場合は、

var myList = myEnumerable.ToList() 

をしかし、あなたは確認することができますので、ここでは解体ですあなたは、次のようなエラーを取得している:

「IEnumerableを」が「ToListメソッド」

の定義が含まれていません。あなたはおそらくそれを追加しますので、 System.Linq名前空間を逃している

using System.Linq 
関連する問題