列表<;T>;在C#中
本文关键字:lt 列表 gt | 更新日期: 2023-09-27 18:25:22
首先我为我糟糕的英语感到抱歉,然后是我的问题;
我知道这里有很多像这样的问题,但我没有找到一个直接的答案。List<T>
是使用某种"链表"机制实现的吗?或者它只是一个过度设计的阵列?
我对列表的性能问题感兴趣,比如排序、插入和删除项目。例如,对于插入操作,"链表"只定义了一些新的连接,但数组需要移动其值。那个列表呢?
是,列出<>是一个数组。是的,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