2009-04-08 109 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 ()之後的Cast (),但我可能會誤解。 – Samuel 2009-04-08 21:31:05

+0

@Samuel - 你說得對。 OfType ()將返回IEnumerable ,這就是你所需要的。編輯並修復。 – 2009-04-08 21:33:42

1

也許不是最好的方式,但它應該工作。

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; 
    } 
} 
8

另一個優雅的方法是創建一個類似這樣的包裝類(我將它包含在我的實用程序項目中)。

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); 

然後,您可以環繞泛型化集合正常的泛型列表。