5

我正在编写的代码从非托管代码接收一个 ArrayList,而这个 ArrayList 将始终包含一个或多个 Grid_Heading_Blk 类型的对象。我考虑过将此 ArrayList 更改为泛型列表,但我不确定转换操作是否会如此昂贵,以致于抵消使用泛型列表的好处。目前,我只是foreach (Grid_Heading_Blk in myArrayList)在将 ArrayList 传递给将使用它的类之后运行一个操作来处​​理 ArrayList 的内容。

我应该将 ArrayList 转换为通用类型列表吗?如果是这样,最有效的方法是什么?

4

7 回答 7

2

我经常使用这个清单来评估像你这样的问题:

  1. 让它正确
  2. 讲清楚
  3. 使其简洁
  4. 让它高效

List<Grid_Heading_Blk>远比. _ _ ArrayList因此,即使不考虑效率,第 2 项已经大获全胜。

要将 a 转换ArrayList为 a List<>,您必须遍历ArrayList一次并强制转换每个元素。正在执行隐式转换,因此foreach开销仅在额外的迭代中。

对序列进行两次迭代会使性能从O(n)O(2n),这仍然是O(n)(对性能而言,重要的是幅度,而不是值)。因此,您可以认为这种变化是良性的。

但是,如果实际上您所做的只是运行foreach您应该直接使用ArrayList- 将其更改为不再为List<>您购买表达能力。

于 2010-06-07T20:42:55.547 回答
2

为什么你需要转换ArrayList呢?老实说,您的 foreach 循环似乎可以解决问题。是的,正如上面凯文所说,你要付出的唯一代价是拆箱——但就目前而言,它是非常简单的代码,你可能没有足够的网格标题来支付真正的性能损失。

但是如果你必须转换它,我会说,而不是编写你自己的 for 循环来转换为 List 泛型类型,使用带有类型的构造函数可能会更好IEnumerableArrayList应该已经实现了一些东西。)

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>( arrayList );
于 2010-06-08T04:02:03.167 回答
2

这是从 ArrayList 创建通用列表的一种高效方法。

List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count);
myList.AddRange(source.OfType<Grid_Heading_Blk>());

通过调用接受 int 的构造函数,后备存储仅分配一次。

与往常一样,您应该使用通常使用的任何工具来衡量性能。

于 2010-06-08T04:15:05.920 回答
1

使用 ArrayLists 的最大惩罚是装箱。

使用泛型,您可以获得:
1. 编译时安全
2. 泛型扩展
3. 消除将列表中的所有内容转换为类型对象的限制。

这些是您使用它们的优势。它们是优势,但如果您必须从 ArrayList 重新填充泛型,则可能不值得这样做,特别是如果您只是循环遍历列表以获取对象。

于 2010-06-07T18:22:40.080 回答
0

“高效”不是非此即彼的属性。这是相对的,就像一只大老鼠可能不比一头小象大。

这取决于你在做什么。

您的里程可能会有所不同,但根据我的经验,虽然ArrayList可能“慢”于List<T>,但我从来没有做如此之少以至于它以任何方式引人注目。

就是说,让编译器为我做类型检查很好,不用强制转换也很好。

于 2010-06-07T20:15:18.563 回答
0

如果对象来自非托管代码,并且您不需要添加或删除对象,则 Grid_Heading_Blk 数组可能比 List 更有效。如果您可以不使用数组,则使用 for 循环可能比 foreach 稍快一些。

于 2010-06-08T00:26:27.223 回答
0

您可以使用Enumerable.OfType(Of TResult) 方法过滤可以转换为相同类型的 arrayList 的所有元素

List<MyClass> typedList = arrayList.OfType<MyClass>().ToList();

(基于http://www.codeproject.com/Tips/68291/Convert-ArrayList-to-a-Generic-List中的建议)

于 2011-10-21T04:32:43.327 回答