. net有很多复杂的数据结构。不幸的是,其中一些非常相似,我不总是确定什么时候使用一个,什么时候使用另一个。我的大多数c#和VB书籍都在一定程度上讨论了它们,但它们从来没有真正深入任何细节。
数组、数组列表、列表、哈希表、字典、排序列表和排序字典之间的区别是什么?
哪些是可枚举的(IList -可以做'foreach'循环)?哪些使用键/值对(IDict)?
内存占用呢?插入速度?检索速度?
还有其他值得一提的数据结构吗?
我还在寻找内存使用和速度的更多细节(大o符号)
. net有很多复杂的数据结构。不幸的是,其中一些非常相似,我不总是确定什么时候使用一个,什么时候使用另一个。我的大多数c#和VB书籍都在一定程度上讨论了它们,但它们从来没有真正深入任何细节。
数组、数组列表、列表、哈希表、字典、排序列表和排序字典之间的区别是什么?
哪些是可枚举的(IList -可以做'foreach'循环)?哪些使用键/值对(IDict)?
内存占用呢?插入速度?检索速度?
还有其他值得一提的数据结构吗?
我还在寻找内存使用和速度的更多细节(大o符号)
当前回答
关于高频系统交易工程的哈希表与字典的一个重要注意事项:线程安全问题
Hashtable是线程安全的,可以被多个线程使用。 字典公共静态成员是线程安全的,但任何实例成员都不能保证是线程安全的。
因此,Hashtable仍然是这方面的“标准”选择。
其他回答
首先,. net中的所有集合都实现了IEnumerable。
其次,很多集合是重复的,因为泛型是在框架的2.0版本中添加的。
因此,尽管泛型集合可能会添加功能,但在大多数情况下:
List是ArrayList的通用实现。 Dictionary<T,K>是Hashtable的泛型实现
数组是一个固定大小的集合,您可以更改存储在给定索引中的值。
SortedDictionary是一个<T,K>的字典,它基于键进行排序。 SortedList是一个<T,K>的字典,它基于所需的IComparer进行排序。
因此,字典实现(那些支持KeyValuePairs)是:
哈希表 词典<T,F> 排序列表<T,F> SortedDictionary<T,K>
. net 3.5中添加的另一个集合是Hashset。它是一个支持集合操作的集合。
而且,LinkedList是一个标准的链表实现(List是一个用于更快检索的数组列表)。
关于高频系统交易工程的哈希表与字典的一个重要注意事项:线程安全问题
Hashtable是线程安全的,可以被多个线程使用。 字典公共静态成员是线程安全的,但任何实例成员都不能保证是线程安全的。
因此,Hashtable仍然是这方面的“标准”选择。
泛型集合将比非泛型集合执行得更好,特别是在遍历许多项时。这是因为装箱和开箱不再发生。
泛型集合和非泛型集合之间存在微妙和不那么微妙的差异。它们只是使用了不同的底层数据结构。例如,Hashtable保证了一个写入器-多个读取器而不需要同步。字典没有。
我同情这个问题——我也发现(发现?)这个选择令人困惑,所以我开始科学地看看哪个数据结构是最快的(我用VB做了测试,但我想c#会是一样的,因为这两种语言在CLR级别上做同样的事情)。您可以在这里看到我进行的一些基准测试结果(还有一些关于在哪种情况下使用哪种数据类型最好的讨论)。