< >强HashSet c# HashSet数据结构在. net Framework 3.5中引入。实现成员的完整列表可以在HashSet MSDN页找到
HashSet
HashSet是一个包含唯一元素的无序集合。它具有标准的集合操作Add、Remove、Contains,但由于它使用基于哈希的实现,这些操作是O(1)。(而不是List,它是O(n)表示包含和删除。)HashSet还提供了标准集操作,如联盟, 十字路口和对称差分。看这里
c#中的HashSet类采用第一种方法,因此不保留了元素的顺序。它比常规的List快得多。一些基本的基准测试表明,HashSet在处理主要类型(int、double、bool等)时要快得多。在处理类对象时速度要快得多。关键是HashSet很快。
List
HashSet的唯一问题是不能通过索引进行访问。要访问元素,您可以使用枚举器或使用内置函数将HashSet转换为List并遍历它。看这里
HashSet有一个内部结构(散列),可以在其中快速搜索和识别项。缺点是遍历HashSet(或按索引获取项)相当慢。
那么为什么有人想知道一个条目是否已经存在于一个集合中呢?
HashSet有用的一种情况是从可能存在重复值的列表中获取不同的值。一旦一个项被添加到HashSet中,就可以快速确定该项是否存在(Contains操作符)。
Contains
HashSet的其他优点是Set操作:IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith。
IntersectWith
IsSubsetOf
IsSupersetOf
Overlaps
SymmetricExceptWith
UnionWith
如果你熟悉对象约束语言,那么你将识别这些set操作。您还将看到它离可执行UML的实现更近了一步。
从应用程序的角度来看,如果只需要避免重复,那么HashSet就是你要找的,因为它是查找,插入和删除复杂度为O(1) -常数。这意味着不管HashSet有多少个元素,检查是否有这样的元素都需要相同的时间,加上因为你在O(1)也插入了元素,所以它非常适合这类事情。
简单地说,没有透露厨房的秘密: 一般来说,集合是不包含重复元素的集合,其元素没有特定的顺序。因此,A HashSet<T>类似于泛型List<T>,但优化为快速查找(通过哈希表,顾名思义),代价是失去顺序
HashSet<T>
List<T>