Define: What is a HashSet?
HashSet的
C#HashSet数据结构是在.NET Framework 3.5中引入的。 可以在HashSet MSDN页面上找到已实现成员的完整列表。
在哪里使用?
你为什么要用它?
-
en.wikipedia.org/wiki/Set_(computer_science)
-
我应该何时使用HashSet < T >类型?
-
它在内部使用哈希表。 如果你有一个好的哈希表实现(例如Dictionary < T >),你可以很容易地自己实现HashSet。
HashSet包含一组对象,但在某种程度上,它允许您轻松快速地确定对象是否已存在于集合中。它通过内部管理数组并使用从对象的哈希码计算的索引存储对象来实现。看看这里
HashSet是包含唯一元素的无序集合。它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,因此这些操作是O(1)。 (与List相反,例如,对于Contains和Remove,它是O(n)。)HashSet还提供标准集合操作,例如并集,交集和对称差异。看看这里
集合有不同的实现。有些通过散列元素使插入和查找操作超快。但是,这意味着添加元素的顺序将丢失。其他实现以较慢的运行时间为代价来保留添加的顺序。
C#中的HashSet类用于第一种方法,因此不保留元素的顺序。它比常规List快得多。一些基本的基准测试表明,在处理主要类型(int,double,bool等)时,HashSet的速度要快得多。使用类对象时速度要快得多。所以关键是HashSet很快。
HashSet的唯一问题是索引无法访问。要访问元素,您可以使用枚举器或使用内置函数将HashSet转换为List并迭代它。看看这里
-
有两件事,hashset和类似的东西是.NET,而不是C#。 HashSet也不保留顺序。尝试添加和删除哈希集中的项目,您将知道您是否稍后进行迭代。
-
非常简单的解释&amp;对比
HashSet具有内部结构(哈希),其中可以快速搜索和识别项目。缺点是迭代HashSet(或按索引获取项目)相当慢。
那么为什么有人想要知道一个条目中是否已存在一个条目?
HashSet有用的一种情况是从可能存在重复项的列表中获取不同的值。将项目添加到HashSet后,可以快速确定项目是否存在(Contains运算符)。
HashSet的其他优点是Set操作:IntersectWith,IsSubsetOf,IsSupersetOf,Overlaps,SymmetricExceptWith,UnionWith。
如果您熟悉对象约束语言,那么您将识别这些设置操作。您还将看到它距离可执行UML的实现更近了一步。
-
Re:缺点。不,迭代HashSet非常快。其次,不可能通过索引获得项目。实际上,元素存储无序。
-
@Nigel Touch。如果您不关心索引(添加它们的顺序),则迭代很快。但是,如果您关注索引,那么索引必须与每个哈希键一起存储,因此它可能相当慢,因为必须彻底搜索列表以检索正确的项目。此行为与列表中的行为非常不同,在列表中,项目按添加顺序编制索引。
-
因为没有两个哈希是相同的,所以它很快就会有意义。使查询能够利用"短路"方法,快速排除某些标准。
简单地说,并没有透露厨房的秘密:
通常,集合是一个不包含重复元素的集合,其元素没有特定的顺序。因此,A HashSet< T >类似于泛型List< T >,但是为了快速查找而优化(通过哈希表,顾名思义),代价是丢失订单。
-
但是HashSet < T >可以存储两个具有相同数据的对象,比如两个Product类,每个类具有相同内容的相同属性吗?
-
我想我们永远不会知道
从应用程序的角度来看,如果只需要避免重复,那么HashSet就是您要查找的内容,因为它的查找,插入和删除复杂性是O(1) - 常量。这意味着无论有多少元素HashSet都需要花费相同的时间来检查是否存在这样的元素,而且因为你在O(1)处插入元素也使得它非常适合这种类型的事情。