我在哪里可以了解各种类型的.NET列表?

时间:2008-10-13 15:57:01

标签: .net collections

有没有人知道一个很好的资源来简明地解释C#中可用的不同类型的列表以及它们的使用何时适用?

例如,List,Hashtable,Dictionaries等。

我不确定何时应该使用什么。

10 个答案:

答案 0 :(得分:32)

这些并非所有列表,尽管它们都是集合。这是一个快速摘要。

非通用集合(API以object表示。值类型已装箱。

这些主要位于System.Collections命名空间中:

  • ArrayList:由数组支持的项目列表。快速随机读/写访问。快速添加到尾端,如果缓冲区不需要调整大小。
  • Hashtable:从键到值的映射。键是唯一的,值不一定。使用GetHashCode方法实现近O(1)读/写访问(除了令人讨厌的情况,其中所有项具有相同的哈希,或者后备存储需要重建)。迭代键/值对会产生不可预测的顺序。 (好吧,实际上是不可预测的。)
  • SortedList:与Hashtable类似,但条目始终按按键排序返回。存储为键/值对列表。
  • Stack:后进先出集合
  • Queue:先进先出集合
  • Array:固定大小的O(1)随机访问;非通用的,但也有强类型的表格

通用馆藏。 (强类型API,不会对框值类型(假设合适的T)。

这些主要位于System.Collections.Generic namespace

最重要的集合界面可能是IEnumerable(和IEnumerable<T>)。这表示一系列项目,就像Stream表示一个字节序列。没有随机访问,只是前向阅读。 LINQ to Objects基于此,几乎所有集合类型都实现它。

答案 1 :(得分:6)

你应该拿一本关于基本数据结构的书。无论语言如何,这都是相同的理论。

一个简短的解释:

  • Array :(如例如int[] myArray) - 当集合永远不会更改时可以使用的静态数组(您无法在其中添加或删除项目,但您可以更改个别项目)
  • ArrayList:通用数组/列表,允许相对快速的枚举以及直接访问。此列表可以在您添加项目时自动增长,但由于它只存储Object,因此会因性能和类型安全问题而很少使用它。
  • List<T>:上述ArrayList的通用版本。它提供了性能和灵活性之间的良好平衡,并且几乎总是在您拥有动态的项目列表时使用。 (.NET 2.0中的新功能)
  • Hashtable:像平面列表一样工作,但不是用整数索引,而是可以使用任何对象编制索引。值得注意的是哈希表中没有“订单”。
  • Dictionary<T>:Hashtable的通用版本。出于与上面的ArrayList vs List相同的原因,在.NET 2.0及更高版本中使用它而不是Hashtable。
  • Stack<T>:提供先进后出类型的列表。您最后添加的项目将是您在选择内容时首先收到的项目。
  • Queue<T>:提供先进先出列表。可以把它想象成一个管子,你可以在一端插入物品,然后在另一端拾取物品。通常用于在例如...之间传递消息线程。

通常,您应该将通用集合用于几乎所有在.NET 2.0及更高版本中执行的操作。您将获得完全的类型安全性(与例如ArrayList和HashTable相比),与非泛型onces相比,它们对于值类型(整数,结构,浮点数等)要快得多。

如果您有一个永远不会改变的项目列表,或者您不需要/想要List<T>的灵活性,您当然可以使用数组,因为它具有最少的开销。

从公共方法或属性返回集合时的建议是将其强制转换为不太灵活的接口。因此,如果您有一个返回的列表,您可以将其转换为IEnumerable<int>,这意味着您的消费者无法向其添加项目(除非它将其强制转换,但它仍然是对用户的指示)。对它进行转换还可以让您在以后更改底层数据结构时具有灵活性,同时保持API的稳定性。您还可以选择ICollection<int>IList<int>以显示更多功能,但保持实际数据结构隐藏。

答案 2 :(得分:6)

答案 3 :(得分:5)

哈希地图

  • 字典
  • Hashtable(非通用)

这是一种允许您保留键值对的数据结构。给定一个具有某种排序方式的Key,您可以插入一个Value。一个简单的例子可以是学生列表,其中Key是学生ID,学生姓名的值。

随机访问列表

  • 列表
  • ArrayList(非泛型)

随机访问列表用于存储要随机访问的长对象列表(即,您希望在O(1)时间内访问第n个元素)。如果你想在列表中间插入/删除元素是不好的,因为这需要整个列表被拖曳,这可能需要一些时间。

关联列表和类似

  • 链表
  • 队列
  • 堆栈

如果您不想访问中间的元素,链接列表很棒,因为这需要O(N)时间。如果你想在中间插入/删除元素,这很好,因为它只涉及改变一些指针。

队列和堆栈略微专业化,因为它们针对FIFO和FILO行为进行了优化(先进先出和先进先出)。

答案 4 :(得分:2)

如果从MSDN doco for System.Collections开始,您可以深入了解各个集合类型,以获取有关这些“列表”以及如何使用它们的更多详细信息。例如,Hashtable的doco表示“代表根据密钥的哈希码组织的键/值对的集合。”

Understanding Generics中对System.Collections.Generic进行了很好的讨论。

答案 5 :(得分:2)

列表与LT; T&GT;是可以排序的,但不建议公开曝光。

收集和LT; T&GT;是一个基本的,没有多余的装饰。

词典&LT; T&GT;是一组键值对(很像旧的哈希表,但现在是通用的)。

KeyedCollection&LT; T&GT;是一个字典,其中的键可以从值中确定(这是一个抽象,所以你必须从它继承并支持GetKey函数)

ReadOnlyCollection&LT; T&GT;是一个特殊的集合,其中的内容无法修改。

从.NET 2.0开始,ArrayList和HashTable基本上已经过时了。

答案 6 :(得分:2)

除了目前为止的优秀答案之外,还有更多可通过C5 Generic Collection Library收集的内容。文档(也在他们的网站上)可能有助于根据您的要求决定使用什么。

答案 7 :(得分:1)

MSDN有一篇名为Selecting a Collection Class的文章,在找出在特定情况下要使用的集合时,我觉得非常有用。

答案 8 :(得分:0)

这些是各种类型general data structures的示例。这些数据结构在软件工程中被广泛使用。

答案 9 :(得分:-3)

如果只是在代码窗口中输入System.collections.Generic.,Intellisense会向您显示每个简短描述。不要忘记尾随时期。哦,还有System.Collections.ObjectModel.。从那里你应该能够获得更多关于MSDN上看起来很有希望的信息。