我正在编写的代码从非托管代码接收ArrayList,并且此ArrayList将始终包含一个或多个Grid_Heading_Blk类型的对象。我已经考虑过将这个ArrayList更改为通用List,但是我不确定转换操作是否会如此昂贵以至于无法使用通用列表的好处。目前,我只是在将ArrayList传递给将使用它的类之后运行foreach (Grid_Heading_Blk in myArrayList)
操作来处理ArrayList内容。
我应该将ArrayList转换为通用类型列表吗?如果是这样,最有效的方法是什么?
答案 0 :(得分:2)
我经常使用此清单来评估像您这样的问题:
List<Grid_Heading_Blk>
远比ArrayList
更具意图启示。因此,即使没有考虑效率,第2项已经取得了巨大成功。
要将ArrayList
转换为List<>
,您必须迭代ArrayList
一次并投射每个元素。 foreach
正在进行隐式转换,因此开销只在额外的迭代中进行。
迭代序列两次会将性能从O(n)
升级到O(2n)
,这仍然是O(n)
(幅度,而非值,对性能至关重要)。因此,您可以认为变化是良性的。
但是,如果您正在使用foreach
字面所有,则应直接使用ArrayList
- 将其更改为List<>
不再购买表现力。
答案 1 :(得分:2)
为什么需要转换ArrayList
?说实话,你的foreach循环似乎可以解决问题。是的,正如凯文所说,你要支付的唯一惩罚就是取消装箱 - 但就目前而言,它是非常简单的代码,你可能没有足够的网格标题来支付真正的性能损失。
但是如果你必须转换它我会说,而不是编写你自己的for循环转换为List泛型类型,最好使用带IEnumerable
类型的构造函数({{1}应该已经实现了。)
ArrayList
答案 2 :(得分:2)
这是一种从ArrayList创建通用列表的高效方法。
List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count);
myList.AddRange(source.OfType<Grid_Heading_Blk>());
通过调用接受int 的构造函数,后备存储只分配一次。
与往常一样,您应该使用通常使用的任何工具来衡量性能。
答案 3 :(得分:1)
使用ArrayLists的最大惩罚是装箱。
使用泛型,你得到:
1.编制时间安全
2.泛型扩展
3.删除将列表中的所有内容转换为类型对象的限制。
这些是您使用它们的优势。它们是有利的,但如果你必须从ArrayList重新填充泛型,那么它可能不值得做,特别是如果你只是循环遍历列表来获取对象。
答案 4 :(得分:0)
“高效”不是一种或两种财产。它是相对的,就像一只大老鼠可能不比小象大。
这取决于你还在做什么。
您的里程可能会有所不同,但根据我的经验,虽然ArrayList
可能比List<T>
“慢”,但我从来没有这么做过以至于它在任何方面都显而易见。
也就是说,让编译器为我做类型检查很好,而且不必抛出东西也很好。
答案 5 :(得分:0)
如果对象来自非托管代码,并且您不需要添加或删除对象,那么Grid_Heading_Blk数组可能比List更有效。如果你可以使用数组,使用for循环可能比foreach稍快。
答案 6 :(得分:0)
您可以使用Enumerable.OfType(Of TResult) Method
过滤可以强制转换为相同类型的arrayList的所有元素List<MyClass> typedList = arrayList.OfType<MyClass>().ToList();
(根据http://www.codeproject.com/Tips/68291/Convert-ArrayList-to-a-Generic-List中的建议)