列出数据结构C#效率

时间:2010-07-11 16:14:29

标签: c# .net generics

目前我正在使用List<short>作为缓冲区来保存一段时间,同时根据缓冲区下方的其他值对每个值进行计算。然后我意识到这可能不是很有效,因为我被告知List<>是一个链表,所以每次我做whatever = myList[100];时,可怜的事情是必须首先跳过所有其他节点达到我想要的价值。我不想使用常规数组,因为我在代码的其他地方有大量的Add()Remove()。所以我需要一个继承IList<T>但使用常规数组数据结构的类。有没有人知道.net中的一个类是这样工作的,所以我不必自己编写?我尝试使用ArrayList,但它'通用!

4 个答案:

答案 0 :(得分:8)

List<T>不使用链接列表实现。在内部它使用一个数组,所以它看起来正是你需要的。请注意,因为它是一个数组,所以删除/插入可能是一个昂贵的操作,具体取决于列表的大小和被删除/插入的位置项 - O(n)。但是,如果不了解您如何使用它,则很难推荐更好的数据结构。

引用docs的备注部分。

  

List(T)类是ArrayList类的通用等价物。它使用一个数组实现IList(T)泛型接口,该数组的大小根据需要动态增加。

答案 1 :(得分:2)

List<T>由数组支持,而不是链接列表。 List<T>的索引访问在固定时间内发生。

答案 2 :(得分:2)

除了tvanfosson的正确答案之外,如果您不确定某些内部是如何工作的,只需加载.NET Reflector即可确切了解事情是如何实现的。在这种情况下,向下钻取到List<T>的索引器会向我们显示以下代码:

public T this[int index]
{
    get
    {
        if (index >= this._size)
        {
            ThrowHelper.ThrowArgumentOutOfRangeException();
        }
        return this._items[index];
    }
    // ...

您可以在其中看到this._items[index]是通用类型T的数组。

答案 3 :(得分:1)

不,List<T>是通用集合,而不是链表。如果您需要添加和删除功能,则List<T>是大多数人默认使用的实现。