定义:什么是HashSet?

001*_*001 406 c# hashset

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

  1. 在哪里使用?
  2. 你为什么要用它?

kam*_*aci 601

    1. A HashSet包含一组对象,但在某种程度上它允许您轻松快速地确定对象是否已存在于集合中.它通过内部管理数组并使用从对象的哈希码计算的索引存储对象来实现.看看这里

    2. HashSet是包含唯一元素的无序集合.它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,因此这些操作是O(1).(与List相反,例如,对于Contains和Remove,它是O(n).)HashSet还提供标准集合操作,例如并,交集对称差异.看看这里

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

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

唯一的问题HashSet是指数无法进入.要访问元素,您可以使用枚举器或使用内置函数将其转换HashSet为a List并迭代它.看看这里

  • 有两件事,hashset和类似的东西是.NET,而不是C#.HashSet也不保留顺序.尝试添加和删除哈希集中的项目,您将知道您是否稍后进行迭代. (13认同)

k r*_*rey 11

A HashSet具有内部结构(哈希),可以快速搜索和识别项目.缺点是迭代HashSet(或通过索引获取项目)相当慢.

那么为什么有人想要知道一个条目中是否已存在一个条目?

a HashSet有用的一种情况是从可能存在重复项的列表中获取不同的值.将项目添加到项目后HashSet,可以快速确定项目是否存在(Contains操作员).

另一优点HashSet是设置操作: IntersectWith,IsSubsetOf,IsSupersetOf,Overlaps,SymmetricExceptWith,UnionWith.

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

  • Re:缺点.不,迭代HashSet非常快.其次,不可能通过索引获得项目.实际上,元素存储无序. (20认同)

Sta*_*ked 6

简单地说,并且没有透露厨房秘密: 一般来说,集合是一个不包含重复元素的集合,其元素没有特定的顺序.因此,A HashSet<T>类似于通用List<T>,但是针对丢失订单而优化用于快速查找(通过哈希表,顾名思义).

  • 但是 HashSet&lt;T&gt; 是否可以存储具有相同数据的两个对象,例如两个具有相同属性和相同内容的 Product 类? (2认同)