HashSet的 C#HashSet数据结构是在.NET Framework 3.5中引入的。可以在HashSet MSDN页面找到已实施成员的完整列表。
答案 0 :(得分:587)
HashSet
包含一组对象,但它允许您轻松快速地确定对象是否已在集合中。它通过内部管理数组并使用从对象的哈希码计算的索引存储对象来实现。 Take a look here
HashSet
是包含唯一元素的无序集合。它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,因此这些操作是O(1)。 (与List相反,例如,包含和删除为O(n)。)HashSet
还提供标准集操作,例如 union , intersection ,和对称差异。Take a look here
集合有不同的实现。有些通过散列元素使插入和查找操作超快。但是,这意味着添加元素的顺序将丢失。其他实现以较慢的运行时间为代价来保留添加的顺序。
C#中的HashSet
类用于第一种方法,因此不保留元素的顺序。它比常规List
快得多。一些基本的基准测试表明,在处理主要类型(int,double,bool等)时,HashSet的速度要快得多。使用类对象时速度要快得多。所以关键是HashSet很快。
HashSet
的唯一问题是索引无法访问。要访问元素,您可以使用枚举器或使用内置函数将HashSet
转换为List
并迭代它。Take a look here
答案 1 :(得分:11)
HashSet
具有内部结构(哈希),可以快速搜索和识别项目。缺点是迭代HashSet
(或按索引获取项目)相当慢。
那么为什么有人想要知道一个条目中是否已存在一个条目?
HashSet
有用的一种情况是从可能存在重复项的列表中获取不同的值。将项目添加到HashSet
后,可以快速确定项目是否存在(Contains
运算符)。
HashSet
的其他优点是设置操作:IntersectWith
,IsSubsetOf
,IsSupersetOf
,Overlaps
,SymmetricExceptWith
,{{1 }}
如果您熟悉object constraint language,那么您将识别这些设置操作。您还将看到它距离可执行UML的实现更近了一步。
答案 2 :(得分:6)
简单地说,并且没有揭露厨房的秘密:
通常,集合是一个不包含重复元素的集合,其元素没有特定的顺序。因此,A HashSet<T>
类似于通用List<T>
,但是为了快速查找而优化(通过哈希表,顾名思义),代价是丢失订单。
答案 3 :(得分:2)
从应用程序的角度来看,如果只需要避免重复,那么HashSet
就是您要查找的内容,因为它是查找,插入和删除complexities are O(1) - constant。这意味着无论有多少元素HashSet
需要花费相同的时间来检查是否存在这样的元素,而且因为您在O(1)处插入元素也是如此,这使得它非常适合这个有点像。