请问.net里的Dictionary和hashset有什么区别? 那种查找性能更好呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 肯定是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,需要做的只是检查值是否已存在。 所以剩下的仅仅是开头提到的集合操作,这是它的缺点,也是特点。 我帮你写出引用吧:) 不过没能保证是原作者。"海口奶茶店"的".net集合类的研究" - http://www.cnblogs.com/hkncd/archive/2011/05/09/2040978.html我相信现在的教育制度有些问题,学校没有教会学生们基本的学问态度和方法,更没有教会要尊重别人的成果。用别人的文章,而没有归功与别人,是不对的。 如非确实不要,不奢谈“那种性能更好”。设计一个框架系统,总要去考虑要不要兼容java和c++,要不要提供最低级的功能问题。但是除此以外,也会痛比较高级的功能。所以有了Dictionary之后,就不用HashTable了。但是它们同时出现在.net这并不奇怪。并不是说我永远不用HashTable,它就不能在.net中。 而HashSet跟字典根本是两个东西,它根本不是字典,你说的其实无法比较。根本不是一个东西,那么他们在逻辑上就有不同的意义和用法,谈不上什么性能问题。 一个是键值对,一个只有键。使用哪种根据功能需求而定,与性能无关。当然你也可以用Dictionary完全替代HashSet,会稍许牺牲一点点性能与一些空间。 用Reflector工具就可以发现,HashSet<T>和Dictionary<TKey,TValue>使用了相同的存储方式和哈希冲突算法. 关于多线程的问题谁能帮我看看下面的程序啊 在winform里导出excel表并显示数据库的内容 用C#开发PDA移动设备,如何直接连接SQL Server 2005 数据库? 如何判断用户输入的是字母(包括大小写) 新手请教关于listbox的问题 删除数据行后再操作表的问题 给点建议——用.NET和SQL Server做点什么有意思的 这个语句错在哪里?SOS! MenuItem的名称为变量名,请问句子该如何写? 苦求C#正则表达式资料下载! updatepanel中image图片更新问题 C#中ihtmldocument2如何获取页面内容
此外,HashSet<T>的Add方法返回bool值,在添加数据时,如果发现集合中已经存在,则忽略这次操作,并返回false值。而Hashtable和Dictionary<TKey,TValue>碰到重复添加的情况会直接抛出错误。
从使用上来看,HashSet<T>和线性集合List<T>更相似一些,但前者的查询效率有着极大的优势。假如,用户注册时输入邮箱要检查唯一性,而当前已注册的邮箱数量达到10万条,如果使用List<T>进行查询,需要遍历一次列表,时间复杂度为O(n),而使用HashSet<T>则不需要遍历,通过哈希算法直接得到列表中是否已存在,时间复杂度为O(1),这是哈希表的查询优势,在上一篇中已提到。
只是一个偏重于存储“键值对”,另一个偏重于集合(不重复)。
HashSet<T>是Set集合,它只实现了ICollection接口,在单独元素访问上,有很大的限制:
跟List<T>相比,不能使用下标来访问元素,如:list[1] 。
跟Dictionary<TKey,TValue>相比,不能通过键值来访问元素,例如:dic[key],因为HashSet<T>每条数据只保存一项,并不采用Key-Value的方式,换句话说,HashSet<T>中的Key就是Value,假如已经知道了Key,也没必要再查询去获取Value,需要做的只是检查值是否已存在。
所以剩下的仅仅是开头提到的集合操作,这是它的缺点,也是特点。
我帮你写出引用吧:) 不过没能保证是原作者。
"海口奶茶店"的".net集合类的研究" -
http://www.cnblogs.com/hkncd/archive/2011/05/09/2040978.html
我相信现在的教育制度有些问题,学校没有教会学生们基本的学问态度和方法,更没有教会要尊重别人的成果。用别人的文章,而没有归功与别人,是不对的。
使用哪种根据功能需求而定,与性能无关。
当然你也可以用Dictionary完全替代HashSet,会稍许牺牲一点点性能与一些空间。