首先,我很抱歉我的英语不好,然后是我的问题;
我知道这里有很多像这样的问题,但是我找不到直接的答案。使用某种“链表”机制实现List<T>
吗?或者它只是一个过度设计的阵列?
我对列表的性能问题很感兴趣,比如排序,插入和删除项目。例如。对于插入操作,'链表'只是定义了一些新连接,但是数组需要移动它的值。列表怎么样?
答案 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引入的最好的功能之一。如果通用列表的性能是一个问题,可以根据用例进行优化,但只需插入即使在一个巨大的列表中也不会花费太多时间。