定义:什么是HashSet?

HashSet C#HashSet数据结构是在.NET Framework 3.5中引入的。 能够在HashSet MSDN页面上找到已实现成员的完整列表。 html

  1. 在哪里使用?
  2. 你为何要用它?

#1楼

从应用程序的角度来看,若是只须要避免重复,那么HashSet就是您正在寻找的,由于它的查找,插入和删除复杂性是O(1) - 常量 。 这意味着不管HashSet有多少元素都须要花费相同的时间来检查是否存在这样的元素,并且由于你在O(1)处插入元素也是如此,这使得它很是适合这类事情。 数组


#2楼

简单地说,而且没有透露厨房秘密:通常来讲,集合是一个不包含重复元素的集合,其元素没有特定的顺序。 所以, HashSet<T>相似于通用List<T> ,可是以丢失顺序为代价,针对快速查找(经过哈希表,顾名思义)进行了优化。 数据结构


#3楼

    1. HashSet包含一组对象,但它容许您轻松快速地肯定对象是否已存在于集合中。 它经过内部管理数组并使用从对象的哈希码计算的索引存储对象来实现。 看看这里 函数

    2. HashSet是一个包含惟一元素的无序集合。 它具备标准的集合操做Add,Remove,Contains,但因为它使用基于散列的实现,所以这些操做是O(1)。 (与List相反,例如,对于Contains和Remove,它是O(n)。) HashSet还提供标准集合操做,例如并交集对称差别看看这里 测试

  1. 集合有不一样的实现。 有些经过散列元素使插入和查找操做超快。 可是,这意味着添加元素的顺序将丢失。 其余实现以较慢的运行时间为代价来保留添加的顺序。 优化

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

HashSet的惟一问题是索引没法访问。 要访问元素,您可使用枚举器或使用内置函数将HashSet转换为List并迭代它。 看看这里 code


#4楼

HashSet具备内部结构(哈希),能够快速搜索和识别项目。 缺点是迭代HashSet (或经过索引获取项目)至关慢。 htm

那么为何有人想要知道一个条目中是否已存在一个条目? 对象

HashSet有用的一种状况是从可能存在重复项的列表中获取不一样的值。 将项目添加到HashSet ,能够快速肯定项目是否存在( Contains运算符)。

HashSet其余优势是Set操做: IntersectWithIsSubsetOfIsSupersetOfOverlapsSymmetricExceptWithUnionWith

若是您熟悉对象约束语言,那么您将识别这些设置操做。 您还将看到它距离可执行UML的实现更近了一步。

相关文章
相关标签/搜索