【问题标题】:Is casting an IEnumerable to an ArrayList O(N) or O(1)?将 IEnumerable 转换为 ArrayList O(N) 还是 O(1)?
【发布时间】:2011-09-10 20:04:24
【问题描述】:

当我做这个演员时:

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

这是“直接”转换,还是可枚举通过内部方法(大概循环所有元素)转换为 ArrayList?

【问题讨论】:

    标签: c# performance casting arraylist


    【解决方案1】:

    这要么是“直接”转换(如果底层对象实际上是 ArrayList 的实例),要么你会得到一个 exception。 ArrayList 对象的隐式创建不是在“幕后”完成的。

    【讨论】:

      【解决方案2】:

      这是直接投射。只有当对象已经是 ArrayList 时它才会起作用,例如:

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

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

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

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

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


      一般来说,您根本不应该使用 ArrayList 类,而应该使用提供严格类型的通用 List<T> 类。

      【讨论】:

      • 至于使用 List 你是对的,但我正在使用大量使用 ArrayLists 的第三方库,我不得不在这里和那里进行转换。
      • 这个第三方库就没有替代品了吗?在现代应用程序中使用 .NET 1.1 方法只会让您感到痛苦。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        相关资源
        最近更新 更多