2009-04-08 67 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); 

然后,您可以环绕泛型化集合正常的泛型列表。