代码之家  ›  专栏  ›  技术社区  ›  Stephen Oberauer

在List<T>类型的对象中,通过索引访问对象是遍历列表中的每个项,还是使用更快的方法?

c#
  •  1
  • Stephen Oberauer  · 技术社区  · 14 年前

    例如:

    List<MyClass> myList = new List<MyClass>();
    ...
    // add lots of members...
    ...
    MyClass myClass = myList[25];
    

    要求索引25的时间会比要求索引1的时间长得多吗,还是会使用一些快速算法直接跳到第25项?

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  2
  •   Regent    14 年前

    内部 List<T> myList[1] myList[25] .)

    节选自 List<T>.Item property 文档:

    检索此属性的值是一个O(1)操作;设置该属性也是一个O(1)操作。

    我可以想象如果.NET应用程序 列表<T>

        2
  •  2
  •   Amy B    14 年前

    Item 财产 List<T>

        3
  •  1
  •   Dan Tao    14 年前

    不,是的 非常 快。事实上,它根本不是一个算法,而是 List<T> T[] 所以它所要做的就是跳转到内存中的一个已知位置。

    抽象地说,可以这样想:因为数组的元素驻留在一个连续的内存块中,所以可以将数组想象成一条数字线。在一行数字上找到“10”比找到“1”要花更多的时间吗?不——你知道数字是怎么排列的,所以你只要直接看10就行了。换言之,你不必在1、2、3等处滚动眼睛。

    当然,这是一个高度非技术性的类比;但它与访问数组元素的工作方式非常一致。

    *A 计算 是必需的,是:数组中第一个元素的地址加上元素大小与索引的乘积。但称之为“算法”是一种延伸;不管怎样,它都是一个常数时间操作。

        4
  •  0
  •   Marcus Johansson    14 年前

    不, 正在删除 插入 另一方面取决于删除元素的位置,因为它是 动态数组 .

    http://en.wikipedia.org/wiki/Dynamic_array

        5
  •  0
  •   Brian Rasmussen    14 年前

    List<T> 使用 T[]