日期:2014-05-18  浏览次数:20862 次

请问.net里的Dictionary和hashset有什么区别?
那种查找性能更好呢?

------解决方案--------------------
肯定是Dictionary了因为Dictionary里面可以按照你放进入的key进行查询,很快捷
------解决方案--------------------
在3.5之前,想用哈希表来提高集合的查询效率,只有Hashtable和Dictionary<TKey,TValue>两种选择,而这两种都是键-值方式的存储。但有些时候,我们只需要其中一个值,例如一个Email集合,如果用泛型哈希表来存储,往往要在Key和Value各保存一次,不可避免的要造成内存浪费。而HashSet<T>只保存一个值,更加适合处理这种情况。
 
此外,HashSet<T>的Add方法返回bool值,在添加数据时,如果发现集合中已经存在,则忽略这次操作,并返回false值。而Hashtable和Dictionary<TKey,TValue>碰到重复添加的情况会直接抛出错误。
 
从使用上来看,HashSet<T>和线性集合List<T>更相似一些,但前者的查询效率有着极大的优势。假如,用户注册时输入邮箱要检查唯一性,而当前已注册的邮箱数量达到10万条,如果使用List<T>进行查询,需要遍历一次列表,时间复杂度为O(n),而使用HashSet<T>则不需要遍历,通过哈希算法直接得到列表中是否已存在,时间复杂度为O(1),这是哈希表的查询优势,在上一篇中已提到。

------解决方案--------------------
他们都是采用Hash方式,从数据结构上说,效率是一致的。
只是一个偏重于存储“键值对”,另一个偏重于集合(不重复)。
------解决方案--------------------
<HashSet<T>不能做的事情>


HashSet<T>是Set集合,它只实现了ICollection接口,在单独元素访问上,有很大的限制:
 
跟List<T>相比,不能使用下标来访问元素,如:list[1] 。
 
跟Dictionary<TKey,TValue>相比,不能通过键值来访问元素,例如:dic[key],因为HashSet<T>每条数据只保存一项,并不采用Key-Value的方式,换句话说,HashSet<T>中的Key就是Value,假如已经知道了Key,也没必要再查询去获取Value,需要做的只是检查值是否已存在。
 
所以剩下的仅仅是开头提到的集合操作,这是它的缺点,也是特点。

------解决方案--------------------
探讨
...