定义:什么是HashSet?

HashSet C#HashSet数据结构是在.NET Framework 3.5中引入的。 完整的成员列表可以在HashSet MSDN页面find。

  1. 它在哪里使用?
  2. 你为什么要使用它?
    1. 一个HashSet拥有一组对象,但是它可以让你轻松快速地确定一个对象是否已经在集合中。 它通过内部pipe理数组并使用从对象的哈希码计算的索引存储对象来实现。 看看这里

    2. HashSet是包含唯一元素的无序集合。 它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,所以这些操作是O(1)。 (而不是List,例如,对于Contains和Remove而言是O(n)). HashSet还提供标准设置操作,例如unionintersectionsymmetric difference 。 看看这里

  1. 集合有不同的实现。 有些通过散列元素使插入和查找操作超快。 但是,这意味着添加元素的顺序会丢失。 其他实现以较慢的运行时间为代价来保存添加的顺序。

C#中的HashSet类用于第一种方法,因此保留元素的顺序。 它比常规List快得多。 一些基本的基准testing表明,HashSet在处理主要types(int,double,bool等)时速度要快得多。 使用类对象时速度要快很多。 所以这一点是HashSet是快速的。

HashSet唯一的HashSet是没有索引访问。 要访问元素,您可以使用枚举器,也可以使用内置函数将HashSet转换为List然后遍历它。 看看这里

HashSet具有内部结构(散列),可以快速search和识别项目。 缺点是迭代HashSet (或通过索引获取项目)是相当缓慢的。

那为什么有人希望能够知道一个条目是否已经存在于一个集合中呢?

HashSet有用的一种情况是从可能存在重复的列表中获取不同的值。 一旦一个项目被添加到HashSet就可以快速确定项目是否存在( Contains操作符)。

HashSet其他优点是Set操作: IntersectWithIsSubsetOfIsSupersetOfOverlapsSymmetricExceptWithUnionWith

如果您熟悉对象约束语言,那么您将识别这些设置的操作。 你也会看到,它更接近于可执行UML的实现。

简单地说,没有揭示厨房的秘密:一般来说,是一个集合,不包含重复的元素,其元素没有特定的顺序。 所以, HashSet<T>类似于通用List<T> ,但是为了快速查找而优化(通过哈希表,顾名思义),但是以损失订单为代价。

从应用程序的angular度来看,如果只需要避免重复,那么HashSet就是您要查找的内容,因为它是Lookup,Insert和Remove 复杂性是O(1) – 常量 。 这意味着无论HashSet有多less个元素,都需要花费相同的时间来检查是否存在这样的元素,再加上因为您在O(1)处插入元素,所以这对于这种事情来说也是完美的。