2009-04-08 3 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(); 
} 

Edit: А если вы просто хотели, TestClass экземпляры (возможно) гетерогенной коллекции, процеживают с OfType <T>:

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

Я не думаю, что вам нужен Cast () после OfType (), но я мог ошибаться. – Samuel

+0

@ Самуэль - Ты прав. OfType () вернет IEnumerable , так что это все, что вам нужно. Отредактировано и исправлено. –

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

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

+0

Это решение сложнее, но полезно решить более сильную проблему, чем вопрос и другой ответ. Когда по какой-то причине первоначальная коллекция известна и модифицируется некоторыми другими объектами, и вы хотите создать экземпляр только одной обобщенной коллекции, она будет отражать будущие изменения. Остерегайтесь. Он теряет некоторые из интерфейсов более высокого уровня, которые могут потребоваться для эффективной обработки, например 'IList '. Другими словами, если производительность важна (например, в запросах LINQ), она должна быть дополнена этими интерфейсами более высокого уровня. –

Смежные вопросы