代码之家  ›  专栏  ›  技术社区  ›  J.W.

将非泛型集合转换为泛型集合的最佳方法

  •  10
  • J.W.  · 技术社区  · 16 年前

    将非泛型集合转换为泛型集合的最佳方法是什么?有办法去林肯吗?

    我有以下代码。

    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.
        }
    }
    

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  22
  •   Markus Meyer    12 年前

    因为您可以保证它们都是testclass实例,所以使用 LINQ Cast<T> method :

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

    编辑:如果您只需要异类集合(可能)的testclass实例,请使用类型<t>对其进行筛选:

    public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection)
    {
       return collection.OfType<TestClass>().ToList();
    }
    
        2
  •  8
  •   cbp    15 年前

    另一种优雅的方法是创建这样的包装器类(我将其包含在我的实用程序项目中)。

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

    然后,您可以围绕泛型化集合包装一个普通的泛型列表。

        3
  •  1
  •   jconlin    16 年前

    也许不是最好的方法,但它应该有效。

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