定义:什么是HashSet?
HashSet C#HashSet数据结构是在.NET Framework 3.5中引入的。 完整的成员列表可以在HashSet MSDN页面find。
- 它在哪里使用?
- 你为什么要使用它?
-
-
一个
HashSet
拥有一组对象,但是它可以让你轻松快速地确定一个对象是否已经在集合中。 它通过内部pipe理数组并使用从对象的哈希码计算的索引存储对象来实现。 看看这里 -
HashSet
是包含唯一元素的无序集合。 它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,所以这些操作是O(1)。 (而不是List,例如,对于Contains和Remove而言是O(n)).HashSet
还提供标准设置操作,例如union , intersection和symmetric difference 。 看看这里
-
-
集合有不同的实现。 有些通过散列元素使插入和查找操作超快。 但是,这意味着添加元素的顺序会丢失。 其他实现以较慢的运行时间为代价来保存添加的顺序。
C#中的HashSet
类用于第一种方法,因此不保留元素的顺序。 它比常规List
快得多。 一些基本的基准testing表明,HashSet在处理主要types(int,double,bool等)时速度要快得多。 使用类对象时速度要快很多。 所以这一点是HashSet是快速的。
HashSet
唯一的HashSet
是没有索引访问。 要访问元素,您可以使用枚举器,也可以使用内置函数将HashSet
转换为List
然后遍历它。 看看这里
HashSet
具有内部结构(散列),可以快速search和识别项目。 缺点是迭代HashSet
(或通过索引获取项目)是相当缓慢的。
那为什么有人希望能够知道一个条目是否已经存在于一个集合中呢?
HashSet
有用的一种情况是从可能存在重复的列表中获取不同的值。 一旦一个项目被添加到HashSet
就可以快速确定项目是否存在( Contains
操作符)。
HashSet
其他优点是Set操作: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
。
如果您熟悉对象约束语言,那么您将识别这些设置的操作。 你也会看到,它更接近于可执行UML的实现。
简单地说,没有揭示厨房的秘密:一般来说,是一个集合,不包含重复的元素,其元素没有特定的顺序。 所以, HashSet<T>
类似于通用List<T>
,但是为了快速查找而优化(通过哈希表,顾名思义),但是以损失订单为代价。
从应用程序的angular度来看,如果只需要避免重复,那么HashSet
就是您要查找的内容,因为它是Lookup,Insert和Remove 复杂性是O(1) – 常量 。 这意味着无论HashSet
有多less个元素,都需要花费相同的时间来检查是否存在这样的元素,再加上因为您在O(1)处插入元素,所以这对于这种事情来说也是完美的。