首先我很抱歉我的英语不好,然后是我的问题;
我知道有很多这样的问题,在这里,但我没有找到一个直接的答案。是List<T>
使用某种“链表”机制实现的吗?或者它只是一个过度设计的阵列?
我对列表的性能问题感兴趣,例如排序、插入和删除项目。例如对于插入操作,“链表”只是定义了一些新的连接,但数组需要改变它的值。清单呢?
首先我很抱歉我的英语不好,然后是我的问题;
我知道有很多这样的问题,在这里,但我没有找到一个直接的答案。是List<T>
使用某种“链表”机制实现的吗?或者它只是一个过度设计的阵列?
我对列表的性能问题感兴趣,例如排序、插入和删除项目。例如对于插入操作,“链表”只是定义了一些新的连接,但数组需要改变它的值。清单呢?
是的, List<> 是一个数组。是的,Insert() 是一个 O(n) 操作。
以这种方式工作很重要,现代处理器非常依赖于它们的缓存。您机器中的 RAM非常慢,比处理器慢得多。高速缓存可以快速顺序访问内存。这与 LinkedList<> 的作用相反。单个缓存未命中会花费数百个 cpu 周期。请注意 LinkedList<> 的另一个显着缺点,除非您可以按顺序索引,否则索引它的成本为 O(n)。List 总是 O(1)。
这些只是粗略的指导方针,没有人可以建议您用 LinkedList 替换您的列表。只有分析器才能做到这一点。
我会说这只是一个过度设计的阵列。对于链接列表,您需要LinkedList<T>
. 有关LinkedList<T>
阅读此内容的更多信息
我会考虑List<T>
过度设计的数组,而不是“链表”。
至于性能,由于List<T>
不是固有排序的,因此性能取决于排序算法(冒泡排序非常慢,因为每个项目都需要检查)。
在 a 中插入和删除项目非常简单,使用vs.List<T>
可以提高插入项目的性能,并将其添加到列表的末尾。List<T>.Add()
List<T>.Insert()
.Add()
要全面了解各种 .NET 集合类型的性能和一般用例,请阅读C#/.NET 基础知识:选择正确的集合类
不,List 不是链表,它只是一个方便的强类型数组。我不会把它称为工程数组,但它是从 C# 2.0 引入的最佳特性之一。如果通用列表的性能是一个问题,则可以根据用例对其进行优化,但即使在巨大的列表中插入也不会花费太多时间。