Лучший способ преобразовать нестандартную коллекцию в универсальную
-
06-09-2019 - |
Вопрос
Каков наилучший способ преобразовать непатентованную коллекцию в универсальную коллекцию?Есть ли способ СВЯЗАТЬ это?
У меня есть следующий код.
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.
}
}
Спасибо!
Решение
Поскольку вы можете гарантировать, что все они являются экземплярами TestClass, используйте Приведение LINQ<T> метод:
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();
}
Другие советы
Другой элегантный способ - создать класс-оболочку, подобный этому (я включаю это в свой проект utilities).
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);
Затем вы могли бы обернуть обычный универсальный список вокруг обобщенной коллекции.
Может быть, не самый лучший способ, но он должен сработать.
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;
}
}
Не связан с StackOverflow