哪些C#容器是连续的,哪些是基于节点的?

时间:2015-02-05 21:47:58

标签: c# list containers

Effective STL 的第1项中,Herb Sutter区分了连续容器和基于节点的容器。向量,字符串和deques是连续的,而链表和关联容器是基于节点的。这对于性能考虑(从开始,中间或结束插入或删除的速度,迭代,大内存分配注意事项等)非常有用。

特别是,我对List<T>以及如下列表感兴趣:BaseList : CollectionBase, ITypedList

我听说List<T>更像是std::vector<T>而不是链接列表。这些C#容器都是连续的吗?除LinkedList<T>之外还有哪些节点容器可用?有可能在MSDN的某个地方进行比较吗?

3 个答案:

答案 0 :(得分:2)

本文中有一个表列出了哪些容器是连续的(向下滚动):

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx

摘录:

List是一个基本的连续存储容器。有些人可能称之为矢量或动态数组。基本上,它是一系列项目,一旦超过其当前容量就会增长。由于项目是作为数组连续存储的,因此您可以非常快速地按索引访问List中的项目。但是,在List的开头或中间插入和删除是非常昂贵的,因为您必须分别在删除或插入时向上或向下移动所有项目。但是,在List的末尾添加和删除是一个分摊的常量操作 - O(1)。通常,当您没有任何其他约束时,List是标准的首选集合,通常我们更喜欢List甚至数组,除非我们确定大小将保持绝对固定。

答案 1 :(得分:1)

最可靠的检查方法是浏览source code

例如,这里是List<T>的代码,该代码在文件顶部的注释中声明:

  

**目的:实现一个动态大小的通用列表   **阵列。

答案 2 :(得分:0)

根据MSDN

  

List类是ArrayList类的通用等价物。它   通过使用其大小的数组来实现IList通用接口   根据需要动态增加。

所以,List<T>是连续的。