列表<;T>;在C#中

本文关键字:lt 列表 gt | 更新日期: 2023-09-27 18:25:22

首先我为我糟糕的英语感到抱歉,然后是我的问题;

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

我对列表的性能问题感兴趣,比如排序、插入和删除项目。例如,对于插入操作,"链表"只定义了一些新的连接,但数组需要移动其值。那个列表呢?

列表<;T>;在C#中

是,列出<>是一个数组。是的,Insert()是一个O(n)运算。

重要的是,它以这种方式工作,现代处理器非常依赖于它们的缓存。机器中的RAM非常慢,比处理器慢得多。高速缓存可以快速顺序访问内存。这与LinkedList<>做一次缓存未命中要花费数百个cpu周期。请注意LinkedList<>的另一个显著缺点,除非可以按顺序进行索引,否则对其进行索引将花费O(n)。列表总是O(1)。

这些只是粗略的指导原则,没有人可以建议你用LinkedList替换你的List。只有探查器才能做到这一点。

我认为它只是一个过度设计的数组。对于链表,您需要LinkedList<T>。有关LinkedList<T>的更多信息,请阅读此

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

至于性能,由于List<T>不是固有的排序,因此性能取决于排序算法(气泡排序非常慢,因为每个项目都需要检查)。

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

要全面了解各种.NET集合类型的性能和一般用例,请阅读C#/.NET Fundamentals:Choose the Right collection Class

不,List不是链表,它只是一个方便的强类型数组。我不会称之为过度设计的阵列,但它是从C#2.0引入的最好的功能之一。如果通用列表的性能令人担忧,则可以根据用例对其进行优化,但即使在庞大的列表中,仅插入也不会花费太多时间。