-1

我有一个名为“ObjectArray”的数组列表,为了提高性能并摆脱强制转换问题,我想使用通用列表,如何将以下 arralist 转换为列表?我知道ToList()会做,但在这种情况下该怎么做

public class ObjectArray : ArrayList
  {}



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


Testobject tmo;

tmo= (Testobject)col[i];
4

2 回答 2

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

于 2013-03-05T09:24:48.287 回答
1

停一秒;你试图让一个班级做两件事。您还将编译时问题转移到运行时。我建议你反序列化强类型并将它们存储在强类型列表中,而不是把所有东西都放在一个列表中。

IE

 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();
于 2013-03-05T09:45:09.547 回答