1

请参阅此处的示例,我按此顺序存储值!但是我得到的输出是不同的!为什么?哈希表以什么顺序存储值?

      {               
        Hashtable ht = new Hashtable();
        ht.Add("001", "Zara Ali");
        ht.Add("002", "Abida Rehman");
        ht.Add("003", "Joe Holzner");
        ht.Add("004", "Mausam Benazir Nur");
        ht.Add("005", "M. Amlan");
        ht.Add("006", "M. Arif");
        ht.Add("007", "Ritesh Saikia");

        ICollection key = ht.Keys;

        foreach (string k in key)
         {
            Console.WriteLine(k + ": " + ht[k]);
         }

       }

输出

006: M. Arif
007: Ritesh Saikia
003: Joe Holzner
002: Abida Rehman
004: Mausam Benazir Nur
001: Zara Ali
005: M. Amlan
4

3 回答 3

4

Hashtable 不保证其中元素的任何定义顺序。哈希表的实现根据它们的 Hashcode 及其内部实现将值拆分到不同的桶中,这意味着相同的值在不同的机器、不同的运行或不同版本的框架上可能有不同的顺序。这是因为哈希表针对按键检索而不是按顺序检索进行了优化。

如果您想要一个既可以按键访问又可以按顺序访问的集合,请使用其中一个专门的集合。根据您使用的Hashtable而不是判断,您Dictionary<K,V>可能正在使用.NET 1.1,在这种情况下,您可以使用SortedListwhich 将在内部维持秩序。较新版本的 .NET在性能特征SortedList<K,V>OrderedDictionary<K,V>有所不同:

于 2014-12-22T07:23:18.907 回答
3

您可以使用SortedDictionary<K, T>而不是过时的HashTable

SortedDictionary<String, String> ht = new SortedDictionary<String, String>() {
  {"001", "Zara Ali"},
  {"002", "Abida Rehman"},
  {"003", "Joe Holzner"},
  {"004", "Mausam Benazir Nur"},
  {"005", "M. Amlan"},
  {"006", "M. Arif"},
  {"007", "Ritesh Saikia"}
};

foreach(var pair in ht)
  Console.WriteLine(pair.Key + " " + pair.Value);

因为Dictionary<K, T>, Set<T>, HashTable(请注意,HashTable 和ICollection都是过时的)不保留您必须使用SortedDictionary<K, T>SortedSet<T> 的顺序。

于 2014-12-22T07:27:35.070 回答
1

Hashtable 不保证任何顺序。您可以根据需要使用Dictionary<string, string>可以按值排序的。您也可以使用SortedDictionary<string, string>默认情况下按键排序。

        Dictionary<string, string> ht = new Dictionary<string, string>();
        ht.Add("001", "Zara Ali");
        ht.Add("002", "Abida Rehman");
        ht.Add("003", "Joe Holzner");
        ht.Add("004", "Mausam Benazir Nur");
        ht.Add("005", "M. Amlan");
        ht.Add("006", "M. Arif");
        ht.Add("007", "Ritesh Saikia");

        var order = ht.OrderBy(x => x.Value);//ht.OrderBy(x => x.Key);

        foreach (var k in order)
        {
            Console.WriteLine(k.Key + ": " + k.Value);
        }
于 2014-12-22T07:30:17.957 回答