Hashtable中的打印顺序?

时间:2014-12-22 07:15:34

标签: c# .net collections hashtable console.writeline

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

      {               
        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

3 个答案:

答案 0 :(得分:4)

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

如果您想要一个可以按键和按顺序访问的集合,请使用其中一个专用集合。根据您使用Hashtable而不是Dictionary<K,V>判断,您可能正在使用.NET 1.1,在这种情况下,您可以使用SortedList来维护内部订单。较新版本的.NET具有SortedList<K,V>OrderedDictionary<K,V>,它们的性能特征略有不同:

答案 1 :(得分: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(注意,HashTabl以及ICollection 已过时)< em>不要保留订单您必须使用SortedDictionary<K, T>SortedSet<T&gt ;.

答案 2 :(得分: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);
        }