我有一个名为“ObjectArray”的arraylist,要做一些性能改进并摆脱出现问题,我想使用Generic List,我怎样才能将以下的arralist转换为List?我知道ToList()
会做但在这种情况下该怎么办
public class ObjectArray : ArrayList
{}
ObjectArray col = ObjectArray.Deserialize(xml, Type.type);
Testobject tmo;
tmo= (Testobject)col[i];
答案 0 :(得分:2)
您不应该继承List<T>
,而应继承Collection<T>
。每个MSDN文档:
System.Collections.Generic.List是专为此设计的通用集合 性能不是继承,因此不包含任何内容 虚拟成员。
可以通过创建实例立即使用Collection类 其中一种构造类型;你所要做的就是指定 要包含在集合中的对象类型。另外,你可以 从任何构造类型派生自己的集合类型,或派生出一个 Collection类本身的泛型集合类型。
从Collection
继承如下。在您的课程中,您可以覆盖(如果需要)基本的集合行为和/或添加您自己的实现。
public class ObjectArray : Collection<T>
请参阅http://msdn.microsoft.com/en-us/library/ms132397(v=vs.80).aspx
答案 1 :(得分:1)
停一秒钟;你正试图让一个班做两件事。您还将编译时问题转移到运行时。我建议你反序列化强类型并将它们存储在强类型列表中,而不是存储在一个列表中。
即。
ViewModel[] viewModels= Serializer.DeserialiseViewModels(fromSomething);
DataModel[] dataModels= Serializer.DeserialiseDataModels(fromSomething);
在任何情况下,您都关注反序列化类型并将它们添加到列表中。所以不要打扰新的集合类,因为你不需要在这里重新发明轮子。
假设您已经对一组对象进行了反序列化,即
object[] loaded = ObjectArraySerializer.Deserialise(fromSomething);
现在你想获得T1和T2类型的所有项目
List<T1> itemsT1 = loaded.OfType<T1>().ToList()
List<T2> itemsT2 = loaded.OfType<T2>().ToList()
现在假设
where T1: TBase, where T2: TBase
你可以做到
List<TBase> TBaseItems = itemsT1.Cast<TBase>().Concat(itemsT2.Cast<TBase>()).ToList();
或者你可以直接做到这一点;
List<TBase> tbaseItems= loaded.OfType<TBase>().ToList();