定义:什么是HashSet?

20 浏览
0 Comments

定义:什么是HashSet?

HashSet(哈希集合)

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

  1. 它在哪里被使用?
  2. 为什么你想要使用它?
0
0 Comments

HashSet是一个集合,它不包含重复元素,并且元素没有特定的顺序。HashSet通过使用哈希表来实现快速查找(正如其名称所示),但代价是失去了顺序。

然而,问题是HashSet是否可以存储具有相同数据的两个对象,比如两个具有相同属性且内容相同的Product类的实例?根据EqualityComparers关心这些属性或者使用关心这些属性的IEqualityComparer构造HashSet,这样做的话,理论上是可以的。HashSet的文档清楚地说明,它依赖于其中一个来确定唯一性。

原文链接: [https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.hashset-1?view=netcore-2.2](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.hashset-1?view=netcore-2.2)

0
0 Comments

HashSet是一种具有内部结构(哈希)的数据结构,可以快速搜索和识别项。然而,遍历HashSet(或通过索引获取项)的速度相对较慢。但是为什么有人希望能够知道集合中是否已经存在某个条目呢?

HashSet的一个有用之处是在从可能存在重复项的列表中获取不同的值。一旦将项添加到HashSet中,就可以快速确定该项是否存在(使用Contains操作符)。

HashSet的其他优势是集合操作:IntersectWith、IsSubsetOf、IsSupersetOf、Overlaps、SymmetricExceptWith、UnionWith。如果您熟悉对象约束语言(OCL),您将会发现这些集合操作。您还将看到它更接近可执行UML的实现。

关于缺点的回答是,遍历HashSet是非常快的。其次,不可能通过索引获取项。实际上,元素是无序存储的。

遍历HashSet如果您不关心索引(添加的顺序),那么速度是很快的。但是,如果您关心索引,则必须将索引与每个哈希键一起存储,因此检索正确的项可能会相对较慢,因为必须对列表进行详尽搜索。这种行为与按照添加顺序索引项的列表非常不同。

HashSet之所以快速,是因为没有两个哈希是相同的。这使得查询可以利用“短路”方法,快速排除某些条件。

HashSet没有“通过索引获取项”的概念。Hashtable代表了一个键值对的集合。

0
0 Comments

HashSet是一种集合,它可以以一种简单快捷的方式确定对象是否已存在于集合中。它通过内部管理一个数组,并使用从对象的哈希码计算出的索引存储对象来实现这一点。

HashSet是一个无序的集合,其中包含唯一的元素。它具有标准的集合操作Add、Remove和Contains,但由于它使用基于哈希的实现,这些操作的时间复杂度为O(1)(相对于List来说,List的Contains和Remove操作的时间复杂度为O(n))。HashSet还提供了标准的集合操作,如并集、交集和对称差集。

存在不同的集合实现方式。一些实现通过对元素进行哈希来使插入和查找操作非常快速,但这意味着元素添加的顺序丢失了。其他实现在保留添加顺序的同时,运行时间较慢。

C#中的HashSet类采用了第一种方法,因此不保留元素的顺序。它比普通的List要快得多。一些基本的基准测试显示,当处理基本类型(如int、double、bool等)时,HashSet的速度相当快。但是当处理类对象时,它的速度要快得多。因此,HashSet的优点在于速度快。

HashSet唯一的限制是不能通过索引访问元素。要访问元素,可以使用枚举器或使用内置的函数将HashSet转换为List,然后通过遍历List来访问元素。

有人提出了HashSet和Dictionary是否不是一回事的问题,因为它们看起来很相似。实际上,HashSet和Dictionary是.NET中的类,不是C#的特定功能。HashSet和Dictionary之间的区别在于,HashSet是一个无序集合,而Dictionary是一个键值对的集合,具有键和值之间的映射关系。

0