在ar#中将arraylist转换为List

时间:2013-03-05 09:05:36

标签: c# .net

我有一个名为“ObjectArray”的arraylist,要做一些性能改进并摆脱出现问题,我想使用Generic List,我怎样才能将以下的arralist转换为List?我知道ToList()会做但在这种情况下该怎么办

public class ObjectArray : ArrayList
  {}



 ObjectArray col = ObjectArray.Deserialize(xml, Type.type);


Testobject tmo;

tmo= (Testobject)col[i];

2 个答案:

答案 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();