在C#中实现List <t>?</t>

时间:2013-07-28 02:55:31

标签: c# list implementation

首先,我很抱歉我的英语不好,然后是我的问题;

我知道这里有很多像这样的问题,但是我找不到直接的答案。使用某种“链表”机制实现List<T>吗?或者它只是一个过度设计的阵列?

我对列表的性能问题很感兴趣,比如排序,插入和删除项目。例如。对于插入操作,'链表'只是定义了一些新连接,但是数组需要移动它的值。列表怎么样?

4 个答案:

答案 0 :(得分:6)

是,列出&lt;&gt;是一个数组。是的,Insert()是一个O(n)操作。

重要的是它以这种方式工作,现代处理器非常依赖于它们的缓存。机器中的RAM 非常慢,比处理器慢得多。缓存可以快速顺序访问内存。这与LinkedList&lt;&gt;的相反确实。单个缓存未命中需要花费数百个cpu周期。请注意LinkedList&lt;&gt;的另一个显着缺点,索引成本为O(n),除非您可以按顺序索引。列表总是O(1)。

这些只是粗略的指导原则,没有人可以建议您用LinkedList替换List。只有剖析器可以做到这一点。

答案 1 :(得分:3)

我想说这只是一个过度设计的阵列。对于链接列表,您需要LinkedList<T>。有关LinkedList<T>的更多信息,请阅读this

答案 2 :(得分:2)

我认为List<T>是一个过度设计的数组,而不是“链表”。

至于性能,由于List<T>本身并未排序,因此性能取决于排序算法(冒泡排序非常慢,因为每个项目都需要检查)。

List<T>中插入和删除项目非常简单,使用List<T>.Add()List<T>.Insert()插入项目可以提高性能,因为.Add()会将其添加到{{1}}列表的末尾。

要彻底处理各种.NET集合类型的性能和一般用例,请阅读C#/.NET Fundamentals: Choosing the Right Collection Class

答案 3 :(得分:2)

不,List不是链表,它只是一个方便的强类型数组。我不会把它称为工程数组,但它是C#2.0引入的最好的功能之一。如果通用列表的性能是一个问题,可以根据用例进行优化,但只需插入即使在一个巨大的列表中也不会花费太多时间。