ジェネリックコレクションに非ジェネリックコレクションを変換するための最良の方法

StackOverflow https://stackoverflow.com/questions/731831

  •  06-09-2019
  •  | 
  •  

質問

ジェネリックコレクションに非ジェネリックコレクションを変換するための最良の方法は何ですか?それを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.
    }
}

ありがとうございます。

役に立ちましたか?

解決

あなたは、彼らがすべてのTestClassをインスタンスしている保証 LINQキャストを使用することができますので、< T>メソッドでます:

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

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

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

他のヒント

別のエレガントな方法は、このようなラッパークラスを(私は私のユーティリティプロジェクトでこれを含める)を作成することです。

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コレクションを中心に、通常の一般的なリストをラップできます。

おそらくない最良の方法、それが動作するはずです。

public class ConvertTest
{
    public static List<TestClass> ConvertToGenericClass( NonGenericCollection    collection) throws I
    {
       List<TestClass> newList = new ArrayList<TestClass>
         for (Object object : collection){
             if(object instanceof TestClass){
                newList.add(object)
              } else {
                throw new IllegalArgumentException();  
              }
          }
     return newList;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top