有没有什么好的资源可以简明地解释C#中可用的不同类型的列表及其适当使用时机?
例如,List、Hashtable、Dictionaries等。
我从来不确定何时应该使用什么。
有没有什么好的资源可以简明地解释C#中可用的不同类型的列表及其适当使用时机?
例如,List、Hashtable、Dictionaries等。
我从来不确定何时应该使用什么。
这些不是所有的列表,但它们都是集合。以下是一个快速概述。
非泛型集合(API以object
为单位。值类型被装箱。
这些主要在System.Collections命名空间中:
泛型集合。 (强类型API,不会装箱值类型(假设适当的T)。
这些主要在System.Collections.Generic命名空间中:
可能最重要的集合接口是IEnumerable(和IEnumerable<T>)。它代表了一个项目序列,就像Stream代表了一系列字节一样。没有随机访问,只有向前读取。LINQ to Objects基于此,并且几乎所有集合类型都实现了它。
cq[0]
(其中0是最旧的项目,下一个要出队,最后弹出)以O(1)的效率访问Stack / Queue中的任何项。HashDictionary<H,K>
: 类似于SCG.Dictionary<H,K>
,提供O(1)的条目访问、插入和删除。还提供一个BucketCostDistribution()
函数,与上面的HashSet<T>
相同。不保证任何特定的枚举顺序。TreeDictionary<H,K>
: 类似于SCG.SortedDictionary<H,K>
,使用红黑树提供持久排序的字典。 条目访问、插入和删除需要O(log n)。 保证字典的枚举遵循键比较器指定的顺序。Guarded Collections
此外,C5还提供了“guarded”集合,它有效地充当只读包装器,防止修改集合。 集合中的项目仍然可以被修改,但是不能向集合中添加、删除或插入项目。
这是关于C5库各种集合的详细答案。我发现C5库非常好用,经常在自己的代码中使用,将常见的C#头文件替换为:
using C5;
using SCG = System.Collections.Generic;
SortedList
和 SortedDictionary
,因为它们通常是真正令人困惑的(即使在JonSkeet的回答之后)。 - Pacerier哈希表
哈希表是一种数据结构,它允许您保留键值对。给定一个有序的键,您可以插入一个值。一个简单的例子可能是学生列表,其中键是学生ID,而值是学生姓名。
随机访问列表
随机访问列表用于存储要随机访问的大量对象(即,您想在O(1)时间内访问第n个元素)。如果您想在列表中间插入/删除元素,则不好,因为这将需要整个列表进行重排,这可能需要一些时间。
链表及其类似物
如果您不想在中间访问元素,则链表很棒,因为这需要O(N)时间。如果您想在中间插入/删除元素,则很棒,因为它只涉及更改一些指针。
队列和栈略微专业化,因为它们针对FIFO和FILO行为进行了优化(分别是先进先出和后进先出)。
Hashtable
的文档说,“表示基于键的哈希码组织的键/值对集合。”List<T>是可排序的,但不建议公开使用。
Collection<T>是基本的、无花俏的集合。
Dictionary<T>是一组键值对的集合(类似于旧的哈希表,但现在是通用的)。
KeyedCollection<T>是一个字典,其中可以从值确定键(这是一个抽象类,因此您必须继承它并支持GetKey函数)
ReadOnlyCollection<T>是一种特殊的集合,其中内容不能被修改。
ArrayList和HashTable从 .NET 2.0 开始基本上已经过时了。
如果您在代码窗口中键入System.collections.Generic.
,Intellisense将为您显示每个的简短描述。不要忘记末尾的句号。还有System.Collections.ObjectModel.
。从那里,您应该能够从MSDN获取更多有关看起来很有前途的任何内容的信息。