【问题标题】:c# Hashtable sorted by Keysc# 按键排序的哈希表
【发布时间】:2012-03-06 00:11:23
【问题描述】:

我有一个带有字母键和数字值的哈希表。 如何根据键对哈希表进行排序?

ExchangeA, 200
ExchangeV, 100
ExchangeC, 200

变成这样

ExchangeA, 200
ExchangeC, 200
ExchangeV, 100

【问题讨论】:

  • 哈希表是一种固有的无序数据结构。你想做什么?可以创建键/值对的排序列表,这会做你想要的吗?
  • 几个答案建议使用 linq 的 Enumerable.OrderBy 扩展方法。值得一提的是,哈希表和字典可以有自定义相等比较器;如果您依赖此功能,您可能希望使用接受自定义 IComparer 实例的 OrderBy 重载,以提供与您用于编译哈希表或字典的相等关系兼容的排序。
  • 我会说你想使用 SortedList 或 SortedDictionary

标签: c# sorting hashtable jquery-ui-sortable


【解决方案1】:

我使用一个列表来存储 Hashtable 的键并对其进行排序,然后使用该排序列表显示 Hashtable。这是我的代码:

        List<string> lst = new List<string>();
        foreach (var key2 in ht.Keys)
        {
            lst.Add(key2.ToString());
        }
        lst.Sort();
        foreach (var item in lst)
        {
            Console.WriteLine(string.Format("{0},{1}", item, ht[item.ToString()]));
        }

【讨论】:

    【解决方案2】:

    我发现“排序”哈希表的最简单方法是:

    var hash = new Hashtable();
    var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys
    var allKvp = from x in orderedKeys select new{ key = x, value = hash[x] };
    

    但是,我没有对原始哈希表进行排序,只是以有序的方式读取其值。

    和其他回复一样,如果你需要以排序方式存储你的数据,最好是使用SortedDictionary

    【讨论】:

      【解决方案3】:

      使用列表而不是散列(或将散列转换为字典),然后执行以下操作:

      var dictionary = new Dictionary<string, int>();
      var l = dictionary.Keys.ToList();
      l.Sort();
      foreach (var key in l)
      {
          Console.WriteLine(dictionary[key]);
      }
      

      【讨论】:

        【解决方案4】:

        您可以为此使用SortedDictionary,它将为您按键排序。在您的情况下,SortedDictionary&lt;string, int&gt; 可以工作:

        SortedDictionary<string, int> dict = new SortedDictionary<string, int>();
        dict.Add("Exchange C", 200);
        dict.Add("Exchange A", 200);
        dict.Add("Exchange V", 100);
        
        foreach (var kvp in dict)
        {
            Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
        }
        

        输出:

        Key = Exchange A, Value = 200
        Key = Exchange C, Value = 200
        Key = Exchange V, Value = 100
        

        【讨论】:

        • 值得注意的是,SortedDictionary 是在内部通过二叉搜索树实现的,具有O(lg n) 检索而不是预期的O(1) 检索哈希表。根据 OP 的需求,他可能想要这个,或者他可能想要像其他答案一样执行 OrderBy
        • 是的 - 这是一个很好的观点 - 使用SortedDictionary 仅在必须经常/总是按顺序检索并且密钥查找时间不重要时才值得使用(@987654330 @ 仍然很棒,但肯定比 O(1)) 更糟
        • @GabeMoothart SortedDictionary&lt;,&gt; 的另一个优点是:它不使用数组,而 Dictionary&lt;,&gt; 使用。如果您有大量对象并且遇到大对象堆碎片问题,SortedDictionary&lt;,&gt; 是一种快速解决方案,可让您的数据远离大对象堆。
        【解决方案5】:

        使用 Linq 很简单 (using System.Linq):

        var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();
        

        返回KeyValuePair&lt;string, int&gt;的列表。

        【讨论】:

          【解决方案6】:

          由于哈希表的性质,您无法根据键对它们进行排序:它们根据哈希码将键组织在存储桶中,哈希码是哈希表无法控制的值。但是,您可以按照您喜欢的任何顺序读取键值对。以下是使用 LINQ 的方法:

          IDictionary<string, int> d = ...; // your hash table
          var ordered = d.OrderBy(p => p.Key).ToList();
          foreach (var p in ordered) {
              Console.WriteLine("Key: {0} Value: {1}", p.Key, p.Value);
          }
          

          【讨论】:

            猜你喜欢
            • 2011-05-19
            • 2023-03-27
            • 1970-01-01
            • 2010-10-20
            • 1970-01-01
            • 2011-07-07
            • 2016-01-10
            • 1970-01-01
            • 2011-01-28
            相关资源
            最近更新 更多