C#有比hashtable更效率或更优秀的东西吗? hashtable总要拆箱,功能太简陋C#有比hashtable更效率或更优秀的东西吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 取决于你要用HashTable做什么。如果你只是当一个列表用,显然数组的效率更高。如果你就是需要一个 Hash + Value 的数据结构,那么 HashTable 就是最适合的。 我想实现一种队列功能,入的只管入,出的只管出hashtable好像是能实现这样的需求,只是拆箱看着不完美呀 本帖最后由 caozhy 于 2011-09-22 02:20:17 编辑 hash算法是用来检索key的. 在检索的时候可以达到最高的搜索速度如果你是这个需求: 从1千万个String里 查找某个字符串 那么没有比hash更好的东西.这个时候你用数组for的话理论上有可能需要循环1000万次. 数据库对某字段建立索引就是用的hash算法.如果你是类队列需求, 那就不适合用hashtable LZ估计都不了解泛型一般知道泛型的人不会轻易用HashTable何况是用来实现队列 不是有个Dictionary<,>类么,可以免去拆装箱 微软在NET2.0推出后,就明确表示尽量抛弃非泛型Collection。请参见MSDN中泛型开篇的说明。 我无非就说了2个观点就引来这样 的攻击... 是不专业,没有大量专业词汇. 但是,您如果以为我这2个观点错误的话,那么我要说了, 要不就是您眼睛该治了,要不就是您的知识该治了.观点1:数据库索引就是用的hash算法.这个你认为异议在哪呢? 数据库索引有 Hash索引和B-Tree索引. 依您的意思呢?观点2面对1000万个String数据,我们要验证自己的某个String是否存在于这1000万个String里面.那么选择用数组+for显然不如hashtable---------------好,我错了,那么您这么厉害, 来反驳一下吧.洗耳恭听. 要效率,找算法,你也提到了 hash 索引和 b-tree不过,多说一句, 1000万个string 查询匹配, 你的思路,肯定有问题的。装拆箱耽误不了您多少时间。但是,就算没有装拆箱,你也不该这么用。 多余的什么都不用说了,看代码看注释吧. System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "arr------>"); String[] list = new String[10000000]; for (int i = 0; i < 10000000; i++) { list[i] = i.ToString(); } System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "<------arr"); //再加载上hashtable要消耗很多时间. //但是我们说, 数据的加载一般是初始化.如果hash是程序的常驻内存对象,这个时间可以忍受 System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "hash------>"); Hashtable hash = new Hashtable(); for (int i = 0; i < 10000000; i++) { hash.Add(i.ToString(), i); } System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "<------hash"); //如果这个操作 非常多呢,巨多呢,你还会说if 1000次,100次,更高效吗?如果程序运行周期巨多这样的查询操作呢? System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "hash:" + hash["9999999"].ToString()); System.Console.ReadLine(); 这么热闹我就不掺和了...只补充两句...1.“hash算法”跟“hashtable”是两码事...2.2005年.NET的Hashtable就被淘汰了... 如果你出入Java论坛,你会发现很多人还在讨论HashTable和HashSet的区别 ms不开源, 你通过什么知道的...如果你只看msdn的话,会有这样的内容:http://msdn.microsoft.com/zh-cn/library/system.collections.hashtable(VS.80).aspx当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。这个,怎么就没有哈希算法了? 1.ms不开源?废话,一个公司开什么源...至于.NET Framework开源是三年多以前的事了...至于我通过什么知道的,微软有官网,世界有新闻机构,我没坐在井底...你不知道只说明你坐在井底...2.“hash算法”跟“hashtable”是两码事...这句话白说了...借用caozhy的话...“和连基本概念都不清楚的人讨论这样的问题讨论不出什么结果。这方面我有教训。”这方面我也有教训,所以我先撤了... 现在貌似Dictionary用的比较多,hashtable确实是很古老的东西了,估计两者底层是一致的。 哦,开源3年了.我不写c#也有3年了.原来变化这么快...CSDN坛子里也不似某些人描述的:"整天混CSDN的都是些菜鸟"还是有些高手的,各位3星以上的都还算CSDN的高手吧.以您这位叫做vrhero为最,这个我这几年来也看见了,废话就不多说了当然,论爱讥讽别人,以及自以为是,也应该是以vrhero为最吧? 你自己可能会称之为对批评的自由之崇尚. 但我丝毫不这么认为.希望上面不被你认为是人身攻击, 我带褒带贬的话应该涉及不到攻击.当然,褒的话甚至你还看不起.看不看得起无所谓,我按客观来说话就行了.至于人身自由 以及技术的含量上,我认为你以及你们确实有这个轻蔑的资格.因为轻蔑的态度他并不违法.从法律上讲这样的态度根本的就是一项完完全全的人身自由.谁也干涉不到. 当然,可能,你的亲友党,以及和你技术相当的人 你并不那么轻蔑.上面是我的非技术观点.下面也是.从技术论坛上来说,如果有问题我认为我大概知道并且不会误导,那么我就会回答.我会把这个问题的基本技术用自己理解描述出来.至于他懂不懂,那就不关我的事情了,因为我尽力了.如果有人发出我认为错误观点,我会直接了当的告诉他你这个观点是错的.然后我会说出我认为正确的话.有必要的话对细节做一番解释。 那么OK. 事情就是这么的单纯;被我指正的人难道还会骂我不成?的确是没有义务必须要去教会谁谁谁什么知识。但是,我至少认为我对待他人的态度,对待他人问题的态度是更可取的。所以,我认为不可取的自然就是受我鄙视的。 完毕。 -- 之前一个长我7,8岁的技术跟我说过中国的技术人缺乏共享精神。 他是对的。 虽然我早知道,现在可能只不过是一次有力的说明。 -- 鄙视至少说明为什么鄙视, 我办到了。 如今大牛都退隐了简单点说,哈希表的查找效率取决于使用何种哈希算法,这句话书上有,MSDN上也有,很简单的一句话所以直接说哈希表的查找效率是最高的的确该打 一般情况下HashTable的替代品应该是HashSet,不过功能上有一点点不同。另外HashTable也不是用来做队列的,只能用来做唯一值查找。顶一下5楼+10楼,说得基本上都对,有人非要钻特殊情况的话不用理他,这个论坛专家太多。hash算法与HashTable确实是两码事,一个是算法,一个是基于算法的实现。 坚决鄙视caozhy之流专家!坚定支持并感谢网友:chichenzhe! [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]public static bool BindHandle(SafeHandle osHandle){ if (osHandle == null) { throw new ArgumentNullException("osHandle"); } bool flag = false; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { osHandle.DangerousAddRef(ref success); flag = BindIOCompletionCallbackNative(osHandle.DangerousGetHandle()); } finally { if (success) { osHandle.DangerousRelease(); } } return flag;} [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]private static extern bool BindIOCompletionCallbackNative(IntPtr fileHandle); BindIOCompletionCallbackNative ?这个东西来源在哪啊? 估计楼主看的教程比较老,老教材都用的是哈希表,因为那时候没有泛型,现在泛型出来了,你非要坚持使用哈希表的话,推荐你使用哈希表的泛型替代Dictionary Dictionary<,> 可以解决装箱拆箱的问题,C#有那么多的数据结构,楼主可以去看看教程,比较什么情况下用哪种数据结构 当然有,就是4.0的SortList对象,这个对象还可以对元素进行排序的.OK!! 嘿,难道你认为.net发布时会去随便删除以前发布过的东西?现在还有,不代表着建议你用。 我从最上面一路看下来,发现即使是批评别人最多的人也始终不肯回答别人的问题,纯吹批评...如果你懒得说可以不说;觉得别人知道得少可以建议他那里升级一下;如果别人已经知道了还来问问题那才是没事找抽,不知道才会来问;怕把别人提高后反过来又会抢你饭碗的,就不要回答好了,类似第一种情况。如果一个地方只有领导没有下属,领导还是领导吗?你有什么本事?人家被你气了大不了不来,犯不着得罪你;最后这个地方只剩下不会解决问题的专家了。有问题的人也再不会来问了;然后说些别的:想来问问题的不要有什么依赖思想,人家帮你,但是同时也有自己的工作事情要处理;专门回答问题为生?那叫五毛能自己做得尽可能自己做,实在不行再问一下我本人是来查资料的,暂时回答不了你的问题顺便说一下,谁研究下Judy数组?那是个B-tree的变种,但是性能表现比hash的稳定。也理论性能也接近O(1)了(实际上是小于等于log/256\(N)),但是因为测试代码的原因,测试结果和hash表差不多。不知道如果用.NET可以做得怎样 我觉得各位没必要这样,虽然两位大侠可能说话刻薄一些,但是起到的作用还是好的,总体来说是利大于弊的,论坛提问也是求人办事, 我就觉得求人就是孙子,就要有点孙子样,他们说得不难听也罢,难听也罢,反正我每次都能多多少少学到点东西,如果今天一下刷出100多个裤衩,没人骂一句,把这俩骂跑了,对于CSDN C#板块来说不也是损失么。和为贵,中庸之道,办成大事不能拘泥于小节。 有瓦, 用object吧,什么都能放.... Queue<T>只是个队列吧?跟hashtble是两类不同的东西。两者的使用场合是不是一样的,我看你的回答也没有高明的地方,还是低调点好,不要随便喷人家。上边有人说:"有1000万的string的同这说了,如果在这些数据中查数据,用hashtable就比较好...",本人并不觉得它的这话体现出人家的基础不好。 帮助 OracleDataAdapter.Fill(DataSet)加载很慢 关于连续数据的缓存问题,有经验的进来看看哦~~ 关于统计的一个问题 问一个关于通讯录系统的问题,用C#做的,在线求解答 网络爬虫如何解析javascript ocx与C#问题 问个很菜的基础问题. 请大家推荐一些C#学习资料及网站,主要适合于新手! udp 监听/接收 问题!!!!【在线】 颜色控制 斑马打印机打印图片
我想实现一种队列功能,入的只管入,出的只管出hashtable好像是能实现这样的需求,只是拆箱看着不完美呀
这个时候你用数组for的话理论上有可能需要循环1000万次. 数据库对某字段建立索引就是用的hash算法.如果你是类队列需求, 那就不适合用hashtable
何况是用来实现队列
我无非就说了2个观点就引来这样 的攻击... 是不专业,没有大量专业词汇. 但是,您如果以为我这2个观点错误的话,那么我要说了, 要不就是您眼睛该治了,要不就是您的知识该治了.观点1:
数据库索引就是用的hash算法.
这个你认为异议在哪呢? 数据库索引有 Hash索引和B-Tree索引. 依您的意思呢?观点2
面对1000万个String数据,我们要验证自己的某个String是否存在于这1000万个String里面.
那么选择用数组+for显然不如hashtable
---------------
好,我错了,那么您这么厉害, 来反驳一下吧.洗耳恭听.
不过,多说一句, 1000万个string 查询匹配, 你的思路,肯定有问题的。
装拆箱耽误不了您多少时间。但是,就算没有装拆箱,你也不该这么用。
多余的什么都不用说了,看代码看注释吧. System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "arr------>");
String[] list = new String[10000000];
for (int i = 0; i < 10000000; i++)
{
list[i] = i.ToString();
}
System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "<------arr");
//再加载上hashtable要消耗很多时间.
//但是我们说, 数据的加载一般是初始化.如果hash是程序的常驻内存对象,这个时间可以忍受
System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "hash------>");
Hashtable hash = new Hashtable();
for (int i = 0; i < 10000000; i++)
{
hash.Add(i.ToString(), i);
}
System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "<------hash"); //如果这个操作 非常多呢,巨多呢,你还会说if 1000次,100次,更高效吗?如果程序运行周期巨多这样的查询操作呢?
System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd mm:ss:fff") + "hash:" + hash["9999999"].ToString()); System.Console.ReadLine();
ms不开源, 你通过什么知道的...
如果你只看msdn的话,会有这样的内容:http://msdn.microsoft.com/zh-cn/library/system.collections.hashtable(VS.80).aspx
当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。这个,怎么就没有哈希算法了?
我不写c#也有3年了.原来变化这么快...CSDN坛子里也不似某些人描述的:"整天混CSDN的都是些菜鸟"还是有些高手的,各位3星以上的都还算CSDN的高手吧.以您这位叫做vrhero为最,这个我这几年来也看见了,废话就不多说了当然,论爱讥讽别人,以及自以为是,也应该是以vrhero为最吧? 你自己可能会称之为对批评的自由之崇尚. 但我丝毫不这么认为.
希望上面不被你认为是人身攻击, 我带褒带贬的话应该涉及不到攻击.当然,褒的话甚至你还看不起.看不看得起无所谓,我按客观来说话就行了.至于人身自由 以及技术的含量上,我认为你以及你们确实有这个轻蔑的资格.因为轻蔑的态度他并不违法.从法律上讲这样的态度根本的就是一项完完全全的人身自由.谁也干涉不到. 当然,可能,你的亲友党,以及和你技术相当的人 你并不那么轻蔑.上面是我的非技术观点.
下面也是.从技术论坛上来说,如果有问题我认为我大概知道并且不会误导,那么我就会回答.
我会把这个问题的基本技术用自己理解描述出来.至于他懂不懂,那就不关我的事情了,因为我尽力了.
如果有人发出我认为错误观点,我会直接了当的告诉他你这个观点是错的.然后我会说出我认为正确的话.有必要的话对细节做一番解释。 那么OK. 事情就是这么的单纯;被我指正的人难道还会骂我不成?
的确是没有义务必须要去教会谁谁谁什么知识。
但是,我至少认为我对待他人的态度,对待他人问题的态度是更可取的。所以,我认为不可取的自然就是受我鄙视的。 完毕。 -- 之前一个长我7,8岁的技术跟我说过中国的技术人缺乏共享精神。 他是对的。 虽然我早知道,现在可能只不过是一次有力的说明。 -- 鄙视至少说明为什么鄙视, 我办到了。
简单点说,哈希表的查找效率取决于使用何种哈希算法,这句话书上有,MSDN上也有,很简单的一句话
所以直接说哈希表的查找效率是最高的的确该打
顶一下5楼+10楼,说得基本上都对,有人非要钻特殊情况的话不用理他,这个论坛专家太多。
hash算法与HashTable确实是两码事,一个是算法,一个是基于算法的实现。
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]
public static bool BindHandle(SafeHandle osHandle)
{
if (osHandle == null)
{
throw new ArgumentNullException("osHandle");
}
bool flag = false;
bool success = false;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
osHandle.DangerousAddRef(ref success);
flag = BindIOCompletionCallbackNative(osHandle.DangerousGetHandle());
}
finally
{
if (success)
{
osHandle.DangerousRelease();
}
}
return flag;
} [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static extern bool BindIOCompletionCallbackNative(IntPtr fileHandle);
BindIOCompletionCallbackNative ?这个东西来源在哪啊?
嘿,难道你认为.net发布时会去随便删除以前发布过的东西?现在还有,不代表着建议你用。
如果你懒得说可以不说;觉得别人知道得少可以建议他那里升级一下;如果别人已经知道了还来问问题那才是没事找抽,不知道才会来问;怕把别人提高后反过来又会抢你饭碗的,就不要回答好了,类似第一种情况。
如果一个地方只有领导没有下属,领导还是领导吗?你有什么本事?人家被你气了大不了不来,犯不着得罪你;最后这个地方只剩下不会解决问题的专家了。有问题的人也再不会来问了;
然后说些别的:想来问问题的不要有什么依赖思想,人家帮你,但是同时也有自己的工作事情要处理;专门回答问题为生?那叫五毛能自己做得尽可能自己做,实在不行再问一下我本人是来查资料的,暂时回答不了你的问题顺便说一下,谁研究下Judy数组?那是个B-tree的变种,但是性能表现比hash的稳定。也理论性能也接近O(1)了(实际上是小于等于log/256\(N)),但是因为测试代码的原因,测试结果和hash表差不多。不知道如果用.NET可以做得怎样
Queue<T>只是个队列吧?跟hashtble是两类不同的东西。两者的使用场合是不是一样的,我看你的回答也没有高明的地方,还是低调点好,不要随便喷人家。上边有人说:"有1000万的string的同这说了,如果在这些数据中查数据,用hashtable就比较好...",本人并不觉得它的这话体现出人家的基础不好。