Лучший способ преобразовать неуниверсальную коллекцию в общую коллекцию - PullRequest
10 голосов
/ 09 апреля 2009

Как лучше всего преобразовать неуниверсальную коллекцию в общую коллекцию? Есть ли способ 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.
    }
}

Спасибо!

Ответы [ 3 ]

22 голосов
/ 09 апреля 2009

Поскольку вы можете гарантировать, что все они являются экземплярами TestClass, используйте LINQ Cast метод :

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();
}
8 голосов
/ 18 августа 2009

Другой элегантный способ - создать класс-оболочку, подобный этому (я включаю это в свой проект утилит).

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

Затем можно обернуть обычный обобщенный список вокруг обобщенной коллекции.

1 голос
/ 09 апреля 2009

Может быть, не самый лучший способ, но он должен работать.

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