将IEnumerable转换为ArrayList O(N)或O(1)?

时间:2011-06-08 12:17:09

标签: c# performance casting arraylist

当我这样做时:

private IEnumerable objects;
ArrayList castedObjects = (ArrayList)objects;

这是一个“直接”强制转换,还是通过内部方法(可能会遍历所有元素)将枚举转换为ArrayList?

3 个答案:

答案 0 :(得分:5)

这是“直接”强制转换(底层对象实际上是ArrayList的一个实例),或者你将获得exception。在场景后面没有隐式创建ArrayList对象。

答案 1 :(得分:3)

这是直接演员。它仅在对象已经是ArrayList时才有效,例如:

IEnumerable objects = new ArrayList();
ArrayList castedObjects = (ArrayList)objects;

如果对象不是ArrayList,而是实现IEnumerable的其他对象,则转换将失败。

您可以从ArrayList创建ICollection,例如:

ICollection objects = new string[] { "a", "b" };
ArrayList castedObjects = new ArrayList(objects);

这将遍历集合并将项目复制到ArrayList,因此这是一个O(n)操作。


通常你不应该使用ArrayList类,而是使用提供严格输入的通用List<T>类。

答案 2 :(得分:1)

这取决于objects实际上是什么。它被引用为IEnumerable,但其实际类型可能是实现IEnumerable的任何内容。

如果引用可以转换为ArrayList(因为它已经是,或继承自ArrayList),那么它就是O(1)。如果它不能,那么你只会得到一个例外。

相关问题