定义:什么是HashSet?

< >强HashSet c# HashSet数据结构在. net Framework 3.5中引入。实现成员的完整列表可以在HashSet MSDN页找到

  1. 在哪里使用?
  2. 你为什么要用它?
256281 次浏览
    1. HashSet保存了一组对象,但它的方式允许你轻松快速地确定一个对象是否已经在该集合中。它通过内部管理数组并使用从对象的hashcode计算的索引存储对象来实现这一点。看这里
  1. HashSet是一个包含唯一元素的无序集合。它具有标准的集合操作Add、Remove、Contains,但由于它使用基于哈希的实现,这些操作是O(1)。(而不是List,它是O(n)表示包含和删除。)HashSet还提供了标准集操作,如联盟十字路口对称差分看这里

  2. set有不同的实现。有些通过散列元素使插入和查找操作超快。但是,这意味着添加元素的顺序丢失了。其他实现以较慢的运行时间为代价保留了添加的顺序。

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

HashSet的唯一问题是不能通过索引进行访问。要访问元素,您可以使用枚举器或使用内置函数将HashSet转换为List并遍历它。看这里

HashSet有一个内部结构(散列),可以在其中快速搜索和识别项。缺点是遍历HashSet(或按索引获取项)相当慢。

那么为什么有人想知道一个条目是否已经存在于一个集合中呢?

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

HashSet的其他优点是Set操作:IntersectWithIsSubsetOfIsSupersetOfOverlapsSymmetricExceptWithUnionWith

如果你熟悉对象约束语言,那么你将识别这些set操作。您还将看到它离可执行UML的实现更近了一步。

从应用程序的角度来看,如果只需要避免重复,那么HashSet就是你要找的,因为它是查找,插入和删除复杂度为O(1) -常数。这意味着不管HashSet有多少个元素,检查是否有这样的元素都需要相同的时间,加上因为你在O(1)也插入了元素,所以它非常适合这类事情。

简单地说,没有透露厨房的秘密: 一般来说,集合是不包含重复元素的集合,其元素没有特定的顺序。因此,A HashSet<T>类似于泛型List<T>,但优化为快速查找(通过哈希表,顾名思义),代价是失去顺序