Hashtable ht = new Hashtable();
            ht.Add(1, 1);
            ht.Add(2, 1);
            ht.Add(3, 1);            foreach (DictionaryEntry obj in ht)
            {
                output.AppendText(obj.Key + ":" + obj.Value + "\n");
            }怎么输出
3:1
2:1
1:1怎么倒过来了呀

解决方案 »

  1.   

    首先,楼主要明白Hashtable不是按照插入的顺序进行物理存储的。原因如下:Hashtable主要的原理是:记录数据value存储位置的索引和key的对应关系。实际上Hashtable用于存储数据value的是其内部私有成员,一个Array。当无参数构造Hashtable的时候,这个Array会有一个默认大小(质数),.Net里是11。
    向Hashtable中Add元素时,会调用 key.GetHashcode,取得这个值之后,根据一个算法,得到一个整数值
    index,且 0 <= index <= 10,然后Array[index]=value, 这样便实现了Hashtable的原则。至于上面提到的算法,可以简单的理解,比如用key.GetHashcode对11取模运算,实际的要比这复杂些。当你遍历Hashtable的时候,实际是对Array进行0到Array.Length的遍历,所以输出结果的顺序和你Add的顺序不匹配。
      

  2.   

    对于楼主的问题我去尝试了一下
    没发现什么好的办法能吧Hashtable按你想要顺序输出只有个比较笨的
    除了Hashtable以外 在定义一个LIST用来储存Hashtable的KEY序列Hashtable ht = new Hashtable();
    List<int> li = new List<int>();
    ht.Add(1, 1);
    li.Add(1);
    ht.Add(2, 1);
    li.Add(2);
    ht.Add(3, 1);
    li.Add(3);li.sort();foreach (var l in li)
    {
        output.AppendText(l.ToString() + ":" + ht[l].ToString() + "\n");
    }以上代码是手敲的 可能有些问题 不过思路是提供给你了
      

  3.   

    hashtable 是按照一点的算法来排序的。
    而不是按照插入数据的顺序或者按照内容排序的。
      

  4.   

    根据 http://msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx#datastructures20_2_topic5 hash function不是简单的 H(key) = GetHash(key) 
    而是 
    H(key) = [GetHash(key) + 1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1))] % hashsize 
    或者 
    Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize 
      

  5.   

    如果对顺序有要求的话,不要用HASHTABLE,用List或者ArrayList都可以
      

  6.   

    Hashtable不能用来做排序的,人家本来就是通过键值来对应值的,如果想实现排序最好是用SortedList<T,K>,比之List和ArrayList好很多,因为它是泛型的,无类型转换,而且实现了键对。