hashtable总要拆箱,功能太简陋C#有比hashtable更效率或更优秀的东西吗?

解决方案 »

  1.   

    取决于你要用HashTable做什么。如果你只是当一个列表用,显然数组的效率更高。如果你就是需要一个 Hash + Value 的数据结构,那么 HashTable 就是最适合的。
      

  2.   


    我想实现一种队列功能,入的只管入,出的只管出hashtable好像是能实现这样的需求,只是拆箱看着不完美呀
      

  3.   

    本帖最后由 caozhy 于 2011-09-22 02:20:17 编辑
      

  4.   

    hash算法是用来检索key的. 在检索的时候可以达到最高的搜索速度如果你是这个需求: 从1千万个String里 查找某个字符串 那么没有比hash更好的东西.
    这个时候你用数组for的话理论上有可能需要循环1000万次. 数据库对某字段建立索引就是用的hash算法.如果你是类队列需求, 那就不适合用hashtable
      

  5.   

    LZ估计都不了解泛型一般知道泛型的人不会轻易用HashTable
    何况是用来实现队列
      

  6.   

    不是有个Dictionary<,>类么,可以免去拆装箱
      

  7.   

    微软在NET2.0推出后,就明确表示尽量抛弃非泛型Collection。请参见MSDN中泛型开篇的说明。
      

  8.   


    我无非就说了2个观点就引来这样 的攻击...  是不专业,没有大量专业词汇. 但是,您如果以为我这2个观点错误的话,那么我要说了, 要不就是您眼睛该治了,要不就是您的知识该治了.观点1:
    数据库索引就是用的hash算法.
    这个你认为异议在哪呢? 数据库索引有 Hash索引和B-Tree索引. 依您的意思呢?观点2
    面对1000万个String数据,我们要验证自己的某个String是否存在于这1000万个String里面.
    那么选择用数组+for显然不如hashtable
    ---------------
    好,我错了,那么您这么厉害, 来反驳一下吧.洗耳恭听.
      

  9.   

    要效率,找算法,你也提到了 hash 索引和 b-tree
    不过,多说一句, 1000万个string 查询匹配, 你的思路,肯定有问题的。
    装拆箱耽误不了您多少时间。但是,就算没有装拆箱,你也不该这么用。
      

  10.   


    多余的什么都不用说了,看代码看注释吧. 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();
      

  11.   

    这么热闹我就不掺和了...只补充两句...1.“hash算法”跟“hashtable”是两码事...2.2005年.NET的Hashtable就被淘汰了...
      

  12.   

    如果你出入Java论坛,你会发现很多人还在讨论HashTable和HashSet的区别
      

  13.   


    ms不开源, 你通过什么知道的...
    如果你只看msdn的话,会有这样的内容:http://msdn.microsoft.com/zh-cn/library/system.collections.hashtable(VS.80).aspx
    当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。这个,怎么就没有哈希算法了?
      

  14.   

    1.ms不开源?废话,一个公司开什么源...至于.NET Framework开源是三年多以前的事了...至于我通过什么知道的,微软有官网,世界有新闻机构,我没坐在井底...你不知道只说明你坐在井底...2.“hash算法”跟“hashtable”是两码事...这句话白说了...借用caozhy的话...“和连基本概念都不清楚的人讨论这样的问题讨论不出什么结果。这方面我有教训。”这方面我也有教训,所以我先撤了...
      

  15.   

    现在貌似Dictionary用的比较多,hashtable确实是很古老的东西了,估计两者底层是一致的。
      

  16.   

    哦,开源3年了.
    我不写c#也有3年了.原来变化这么快...CSDN坛子里也不似某些人描述的:"整天混CSDN的都是些菜鸟"还是有些高手的,各位3星以上的都还算CSDN的高手吧.以您这位叫做vrhero为最,这个我这几年来也看见了,废话就不多说了当然,论爱讥讽别人,以及自以为是,也应该是以vrhero为最吧? 你自己可能会称之为对批评的自由之崇尚. 但我丝毫不这么认为.
    希望上面不被你认为是人身攻击, 我带褒带贬的话应该涉及不到攻击.当然,褒的话甚至你还看不起.看不看得起无所谓,我按客观来说话就行了.至于人身自由 以及技术的含量上,我认为你以及你们确实有这个轻蔑的资格.因为轻蔑的态度他并不违法.从法律上讲这样的态度根本的就是一项完完全全的人身自由.谁也干涉不到. 当然,可能,你的亲友党,以及和你技术相当的人 你并不那么轻蔑.上面是我的非技术观点.
    下面也是.从技术论坛上来说,如果有问题我认为我大概知道并且不会误导,那么我就会回答.
    我会把这个问题的基本技术用自己理解描述出来.至于他懂不懂,那就不关我的事情了,因为我尽力了.
    如果有人发出我认为错误观点,我会直接了当的告诉他你这个观点是错的.然后我会说出我认为正确的话.有必要的话对细节做一番解释。  那么OK. 事情就是这么的单纯;被我指正的人难道还会骂我不成?
    的确是没有义务必须要去教会谁谁谁什么知识。
    但是,我至少认为我对待他人的态度,对待他人问题的态度是更可取的。所以,我认为不可取的自然就是受我鄙视的。 完毕。 -- 之前一个长我7,8岁的技术跟我说过中国的技术人缺乏共享精神。 他是对的。 虽然我早知道,现在可能只不过是一次有力的说明。 -- 鄙视至少说明为什么鄙视, 我办到了。
      

  17.   

    如今大牛都退隐了
    简单点说,哈希表的查找效率取决于使用何种哈希算法,这句话书上有,MSDN上也有,很简单的一句话
    所以直接说哈希表的查找效率是最高的的确该打
      

  18.   

    一般情况下HashTable的替代品应该是HashSet,不过功能上有一点点不同。另外HashTable也不是用来做队列的,只能用来做唯一值查找。
    顶一下5楼+10楼,说得基本上都对,有人非要钻特殊情况的话不用理他,这个论坛专家太多。
    hash算法与HashTable确实是两码事,一个是算法,一个是基于算法的实现。
      

  19.   

    坚决鄙视caozhy之流专家!坚定支持并感谢网友:chichenzhe!
      

  20.   


    [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 ?这个东西来源在哪啊?
      

  21.   

    估计楼主看的教程比较老,老教材都用的是哈希表,因为那时候没有泛型,现在泛型出来了,你非要坚持使用哈希表的话,推荐你使用哈希表的泛型替代Dictionary
      

  22.   

    Dictionary<,> 可以解决装箱拆箱的问题,C#有那么多的数据结构,楼主可以去看看教程,比较什么情况下用哪种数据结构
      

  23.   

    当然有,就是4.0的SortList对象,这个对象还可以对元素进行排序的.OK!!
      

  24.   


    嘿,难道你认为.net发布时会去随便删除以前发布过的东西?现在还有,不代表着建议你用。
      

  25.   

    我从最上面一路看下来,发现即使是批评别人最多的人也始终不肯回答别人的问题,纯吹批评...
    如果你懒得说可以不说;觉得别人知道得少可以建议他那里升级一下;如果别人已经知道了还来问问题那才是没事找抽,不知道才会来问;怕把别人提高后反过来又会抢你饭碗的,就不要回答好了,类似第一种情况。
    如果一个地方只有领导没有下属,领导还是领导吗?你有什么本事?人家被你气了大不了不来,犯不着得罪你;最后这个地方只剩下不会解决问题的专家了。有问题的人也再不会来问了;
    然后说些别的:想来问问题的不要有什么依赖思想,人家帮你,但是同时也有自己的工作事情要处理;专门回答问题为生?那叫五毛能自己做得尽可能自己做,实在不行再问一下我本人是来查资料的,暂时回答不了你的问题顺便说一下,谁研究下Judy数组?那是个B-tree的变种,但是性能表现比hash的稳定。也理论性能也接近O(1)了(实际上是小于等于log/256\(N)),但是因为测试代码的原因,测试结果和hash表差不多。不知道如果用.NET可以做得怎样
      

  26.   

    我觉得各位没必要这样,虽然两位大侠可能说话刻薄一些,但是起到的作用还是好的,总体来说是利大于弊的,论坛提问也是求人办事, 我就觉得求人就是孙子,就要有点孙子样,他们说得不难听也罢,难听也罢,反正我每次都能多多少少学到点东西,如果今天一下刷出100多个裤衩,没人骂一句,把这俩骂跑了,对于CSDN C#板块来说不也是损失么。和为贵,中庸之道,办成大事不能拘泥于小节。
      

  27.   

    有瓦, 用object吧,什么都能放....
      

  28.   

     
    Queue<T>只是个队列吧?跟hashtble是两类不同的东西。两者的使用场合是不是一样的,我看你的回答也没有高明的地方,还是低调点好,不要随便喷人家。上边有人说:"有1000万的string的同这说了,如果在这些数据中查数据,用hashtable就比较好...",本人并不觉得它的这话体现出人家的基础不好。