.净的数据结构:对列表、列表、HashTable、字典、SortedList,SortedDictionary速度、存储器,并且当使用每个?
-
02-07-2019 - |
题
.净具有大量复杂数据的结构。不幸的是,他们中的一些是相当类似,我并不总是确定何时使用和何时使用另一个。我的大部分C#和视觉基本的书谈论它们在一定程度,但是他们从来没有真正进入任何实际详细说明。
之间有什么区别阵列,对列表、列表、Hashtable、字典、SortedList,并SortedDictionary?
哪些是可枚举(IList--可以做'foreach'循环)?哪个使用关键值对(IDict)?
那么存储器的足迹?插入的速度?检索的速度?
是否有任何其他数据结构值得一提的?
我仍在寻找更多的细节上存使用情况和速度(Big-O notation).
解决方案
关掉我的头顶:
Array
*代表一个老学校的存储器阵列-有点像一个别名,对于一个正常的type[]
阵列。可以枚举。不能自动增长。我会假设非常快插入和retrival速度。ArrayList
-自动增长的阵列。增加了更多的开销。可以枚举。, 可能比正常的阵列,但仍然很快。这些都是用了很多。净List
-我的收藏-可以使用仿制药,所以你可以有一个强类型阵列,例如List<string>
.此外,行为非常喜欢ArrayList
Hashtable
-普通的老hashtable.O(1)至O(n)最糟糕的情况。可以枚举的价值,并键特性,并做钥/val对Dictionary
-上述相同只强类型的通过泛型的,例如Dictionary<string, string>
SortedList
-一个排的通用清单。减缓对插入,因为它具有找出在哪里把事情。可以枚举。, 可能是同一个上检索,因为它没有为度假胜地,但删除的速度将慢于一个普通的老清单。
我倾向于使用 List
和 Dictionary
所有的时间-一旦你开始使用它们强类型的有仿制药,它真的很难回到标准的非通用的。
还有很多其他的数据结构过-没有 KeyValuePair
你可以用它来做一些有趣的事情,有一个 SortedDictionary
这可能是有用的。
其他提示
如果可能的话,使用仿制药。 这包括:
- 列表,而不是。
- 字典代替HashTable
第一,所有的集中。网实施的类型.
第二,很多收藏品是重复的,因为仿制药中添加了2.0版本的框架。
所以,虽然通用的集合,有可能添加的特点,大部分:
- 列表是一个通用的执行。.
- 词典是一个通用的执行Hashtable
阵列是一个固定的尺寸的收集,你可以改变的价值存在一定的索引。
SortedDictionary是IDictionary,是根据键。SortedList是IDictionary,是基于一个需要IComparer.
因此,IDictionary实现中(这些支持KeyValuePairs):*Hashtable *字典 *SortedList *SortedDictionary
另一个集合,是加。净3.5是的。.这是一个收集,支持设置的操作。
此外,该链表是一个标准的联系清单的实施(列表是列清单更快地检索).
一本好的备忘单,提到数据结构,算法等的复杂性。
这里有几个一般性建议:
你可以使用
foreach
在类型,实现IEnumerable
.IList
基本上是一个IEnumberable
与Count
和Item
(访问的项目使用一种基于零的索引)的性质。IDictionary
另一方面意味着你可以访问的项目通过的任何哈希指数。Array
,ArrayList
和List
所有实现IList
.Dictionary
,SortedDictionary
, ,Hashtable
实施IDictionary
.如果您使用。网2.0或更高,这是建议您使用通用的同行所提到的类型。
对于时间和空间上复杂性的各种操作上的这些类型时,应当征询他们的文件。
.净数据结构
System.Collections
名字空间。有类型的图书馆如 PowerCollections 它提供额外的数据结构。得到彻底的理解数据的结构,咨询资源,例如 CLR.
.NET数据结构:
更多关于为什么ArrayList和List实际上不同的对话
阵列
正如一位用户所说,阵列是“旧学校”。集合(是的,数组被认为是一个集合,虽然不是 System.Collections
的一部分)。但是,什么是“旧学校”关于与其他集合相比较的数组,即您在标题中列出的数组(此处为ArrayList和List(Of T))?让我们从基础开始看看Arrays。
首先,在Microsoft .NET中数组是,“ ;允许您将多个[逻辑相关]项目视为单个集合的机制,“ (见相关文章)。那是什么意思?数组按顺序存储各个成员(元素),在内存中一个接一个地存储起始地址。通过使用数组,我们可以轻松访问从该地址开始的顺序存储的元素。
除此之外,与编程101个常见概念相反,数组实际上可能非常复杂:
数组可以是单维,多维或jadded(锯齿状数组值得一读)。数组本身不是动态的:一旦初始化, n 大小的数组会保留足够的空间来容纳 n 个对象。数组中的元素数量不能增长或缩小。 Dim _array As Int32()= New Int32(100)
在内存块上保留足够的空间,使数组包含100个Int32基本类型对象(在这种情况下,数组初始化为包含0)。该块的地址返回 _array
。
根据文章,公共语言规范(CLS)要求所有阵列从零开始。 .NET中的数组支持非零数组;然而,这不太常见。作为“共同”的结果。在基于零的阵列中,微软花了很多时间来优化他们的性能;因此,单维,零基(SZ)阵列是“特殊的”阵列。 - 并且确实是数组的最佳实现(与多维等相反) - 因为SZ具有用于操纵它们的特定中间语言指令。
数组总是通过引用传递(作为内存地址) - 要知道的数组难题中的一个重要部分。虽然它们进行边界检查(将引发错误),但也可以在数组上禁用边界检查。
同样,数组的最大障碍是它们不具有可重复性。他们有一个“固定”的容量。在我们的历史中引入ArrayList和List(Of T):
ArrayList - 非通用列表
ArrayList (以及 List(Of T)
- 尽管存在一些重要的差异,这里,稍后会解释) - 也许最好被认为是集合的下一个补充(广义上)。 ArrayList继承自 IList ('ICollection'的后代)接口。 ArrayLists本身是笨重 - 需要更多开销 - 而不是列表。
IList
确实使实现能够将ArrayLists视为固定大小的列表(如Arrays);但是,除了ArrayLists添加的附加功能之外,使用固定大小的ArrayLists作为ArrayLists(在Arrays上)没有任何实际优势。
我同情这个问题 - 我也发现(找到?)选择令人困惑,所以我科学地设定了哪个数据结构最快(我用VB做了测试,但我想C#会是一样的,因为两种语言在CLR级别都做同样的事情)。你可以看到我在这里进行的一些基准测试结果(还讨论了哪种数据类型最适合在哪种情况下使用)。
他们在intellisense中拼写得非常好。只需输入 System.Collections。或 System.Collections.Generics (首选),您将获得可用内容的列表和简短说明。
Hashtables / Dictionaries是O(1)性能,这意味着性能不是大小的函数。知道这一点很重要。
编辑:实际上,Hashtable / Dictionary&lt;&gt;的平均时间复杂度。查找是O(1)。
泛型集合的性能优于非泛型集合,尤其是在迭代许多项目时。这是因为不再发生装箱和拆箱。
关于高频系统交易工程的Hashtable vs Dictionary的重要说明:线程安全问题
Hashtable是多线程使用的线程安全。 字典公共静态成员是线程安全的,但不保证任何实例成员都是这样。
因此,Hashtable仍然是这方面的“标准”选择。
通用和非通用集合之间存在微妙且不那么微妙的差异。它们仅使用不同的底层数据结构。例如,Hashtable保证一个作者多读者没有同步。字典没有。
实际上,我认为 MSDN 有助于为所有这些问题提供相当好的答案。只需查看.NET集合。
最受欢迎的C#数据结构和集合
- 阵列
- 。
- 列表
- 链表
- 词典
- 。
- 栈
- 的队列
- SortedList
C#.NET 有很多不同的数据结构,例如,一个最常见的是一个阵列。然而C#带来更多的基本数据的结构。选择正确的数据结构来使用的一部分写入一个结构良好的和有效的程序。
在这篇文章中我会走过去的建C#数据结构,包括新的介绍了C#.NET 3.5.请注意,许多的这些数据结构适用于其他的编程语言。
阵列
这也许是最简单和最常见的数据结构的阵列。C#阵基本上是一个名单的对象。它的确定特征是,所有对象都是同一类型(在大多数情况下)有一定数量的。大自然的一系列可以非常快的访问要素的基础上他们的位置列表(也称为索引)。C#列的定义是这样的:
[object type][] myArray = new [object type][number of elements]
一些例子:
int[] myIntArray = new int[5];
int[] myIntArray2 = { 0, 1, 2, 3, 4 };
你可以看到从上面的例子中,一系列可intialized没有要素或一组现有的价值观。插入价值观纳入一系列简单,只要他们配合。动作变得代价高昂的当有更多的元素比阵列的大小,在这一点上阵列需要扩大。这需要更长的时间,因为所有现有的元素都必须被复制到新的、更大的阵列。
。
C#数据结构、数组列表,是一个动态阵列。这意味着什么是对列表可以有任何数量的目的和任何类型。这个数据结构的设计是为了简化的进程增加新的元素纳入一个阵列。在引擎盖下,对列表是一系列其尺寸增加了一倍,每次它跑出来的空间。增加一倍的大小,内部阵列是一个非常有效的策略,减少了大量元素的复制在长期运行。我们不会得到的证明这一点。数据结构非常简单的使用:
ArrayList myArrayList = new ArrayList();
myArrayList.Add(56);
myArrayList.Add("String");
myArrayList.Add(new Form());
的缺点。数据结构是一个必须投retrived值回到他们原来的类型:
int arrayListValue = (int)myArrayList[0]
来源和更多信息你可以在这里找到 :