Лучший способ конвертировать не общую коллекцию в общую коллекцию
Каков наилучший способ преобразования не общей коллекции в общую коллекцию? Есть ли способ 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.
}
}
Спасибо!
Ответы
Ответ 1
Поскольку вы можете гарантировать, что все экземпляры TestClass, используйте LINQ Cast <T> Метод:
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();
}
Ответ 2
Еще один элегантный способ - создать класс-оболочку, подобный этому (я включаю это в мой проект утилит).
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
Возможно, это не лучший способ, но он должен работать.
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;
}
}