2009-04-08 30 views
10

非ジェネリックコレクションをジェネリックコレクションに変換する最良の方法は何ですか?それをLINQする方法はありますか?非ジェネリックコレクションをジェネリックコレクションに変換する最も良い方法

私は以下のコードを持っています。

public class NonGenericCollection:CollectionBase 
{ 
    public void Add(TestClass a) 
    { 
     List.Add(a); 
    } 
} 

public class ConvertTest 
{ 
    public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
    { 
     // Ask for help here. 
    } 
} 

ありがとう!

答えて

22

あなたは、彼らがすべてのTestClassをインスタンスしている保証LINQ Cast<T> methodを使用することができますので:

public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
{ 
    return collection.Cast<TestClass>().ToList(); 
} 

編集:そして、あなただけの(おそらく)異種コレクションのTestClassをインスタンスを望んでいた場合は、OfType < Tでそれをフィルタリングします>:

public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
{ 
    return collection.OfType<TestClass>().ToList(); 
} 
+1

OfType ()の後にキャスト()が必要ではないと思われますが、間違いかもしれません。 – Samuel

+0

@Samuel - あなたが正しいです。 OfType ()はIEnumerable を返しますので、それだけで十分です。編集され、修正されました。 –

1

おそらく最も良い方法ではありませんが、うまくいくはずです。

8

もう1つの優雅なやり方は、このようなラッパークラスを作成することです(これは私のユーティリティプロジェクトに含めます)。

public class EnumerableGenericizer<T> : IEnumerable<T> 
{ 
    public IEnumerable Target { get; set; } 

    public EnumerableGenericizer(IEnumerable target) 
    { 
     Target = target; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach(T item in Target) 
     { 
      yield return item; 
     } 
    } 
} 

あなたは今、この操作を行うことができます。

IEnumerable<MyClass> genericized = 
    new EnumerableGenericizer<MyClass>(nonGenericCollection); 

その後、genericizedコレクション周囲の正常ジェネリックリストを包むことができます。

+0

このソリューションはより複雑ですが、質問やその他の答えよりも強い問題を解決するのに役立ちます。なんらかの理由で元のコレクションが他のオブジェクトによって認識され、変更されている場合に、1つの汎用コレクション・ハットのみをインスタンス化したい場合、将来の変更が反映されます。しかし、注意してください。効率的な処理に必要な、より高水準のインタフェースを失います。たとえば、「IList 」です。つまり、パフォーマンスが重要な場合(たとえばLINQクエリの場合)、それらの上位レベルのインターフェイスで処理を完了する必要があります。 –

関連する問題