【问题标题】:Is it possible to sort a HashTable?是否可以对哈希表进行排序?
【发布时间】:2010-10-15 02:46:19
【问题描述】:

我有一个返回HashTable 的属性。我想在不重构我的属性的情况下对其进行排序。 请注意:我不想返回其他类型。 代码:

    /// <summary>
    /// All content containers.
    /// </summary>
    public Hashtable Containers
    {
        get
        {
            Hashtable tbl = new Hashtable();
            foreach (Control ctrl in Form.Controls)
            {
                if (ctrl is PlaceHolder)
                {
                    tbl.Add(ctrl.ID, ctrl);
                }
                // Also check for user controls with content placeholders.
                else if (ctrl is UserControl)
                {
                    foreach (Control ctrl2 in ctrl.Controls)
                    {
                        if (ctrl2 is PlaceHolder)
                        {
                            tbl.Add(ctrl2.ID, ctrl2);
                        }
                    }
                }
            }

            return tbl;
        }
    }

【问题讨论】:

  • +1 因为投反对票!这是一个不了解 HashTable 是什么的人提出的完全有效的问题!
  • +1 因为投反对票。问题表明海报不知道 HashTables 是如何工作的,但它是一个完全有效的主题。
  • @agassan:我清理了您的帖子,使其更具凝聚力并删除了 LINQ 问题,因为这似乎不是您真正要问的。如果您不喜欢,请随意回滚。
  • +1 因为投反对票,但也因为这是一个不错的问题。顺便说一句,有关 HT 分类和新用户混淆的更多信息,请参阅stackoverflow.com/questions/2453624/unsort-hashtable

标签: c# sorting hashtable


【解决方案1】:

哈希表通过将键映射到值来工作。此映射中隐含的概念是键不按任何特定顺序排序或存储。

不过,你可以看看SortedDictionary&lt;K,V&gt;

【讨论】:

  • 谢谢。效果很好。我很容易反应属性,因为我的大多数下拉元素都使用键对值
【解决方案2】:

另一种选择是像您已经在做的那样构造哈希表,然后简单地从键构造一个排序集。您可以遍历该排序键集,根据需要从哈希表中获取相应的值。

【讨论】:

    【解决方案3】:

    lubos 是对的:你不能对 HashTable 进行排序。如果可以,它就不会是 HashTable。可以枚举HashTable,然后对枚举进行排序。但这会很慢。改用SortedDictionary 会更好。

    【讨论】:

      【解决方案4】:

      抱歉,您无法对哈希表进行排序。您将不得不重构代码以使用一些可排序的集合。

      【讨论】:

        【解决方案5】:

        我很确定哈希表无法排序... ;)

        Wikipedia Hash Table

        【讨论】:

          【解决方案6】:

          您将需要返回哈希表以外的其他内容。我不会重复您声称已经理解的内容,但是您需要重新考虑设计的任何部分要求您在哈希表中返回已排序的对象。

          【讨论】:

            【解决方案7】:

            不完全是 C# 答案,但我相信你可以有所作为。

            在 Perl 中,通常对哈希表进行“排序”以用于输出到显示器。

            例如:

            print "Items: ";
            foreach (sort keys %items) {
                print $_, '=', $items{$_}, ' ';
            }
            

            这里的诀窍是 Perl 不对散列进行排序,而是对一个复制的散列键列表进行排序。在 C# 中应该很容易将哈希键提取到列表中,然后对该列表进行排序。

            【讨论】:

            • 我已经做到了,通过创建 SortList 对象然后循环哈希表值并将值放入 SortList 然后 sortList.Sort()
            【解决方案8】:

            没有必要对哈希表进行排序,因为您已经拥有几乎恒定的查找时间。或者最坏的情况是 O(B),其中 B 是桶大小。

            【讨论】:

              【解决方案9】:

              当然可以对哈希表进行排序,但是您需要首先定义对哈希表进行排序的含义。 (这就是问题所在)

              然而,一旦你这样做了,你总是消除了哈希表可以给你的所有优点,你不妨使用排序数组(使用二进制搜索),或者改用红黑树。

              【讨论】:

                【解决方案10】:

                我是一名新程序员,所以我说的每一句话都持保留态度。但这是我遇到类似情况时所做的。我创建了一个包含两个变量的类,然后从这些变量中创建了一个 List 对象,然后我使用 linq 对这些变量进行排序。

                【讨论】:

                  【解决方案11】:

                  您还可以使用 DataView 对 Hashtable 进行排序。这是我5年前写的一篇文章:http://www.codeproject.com/Articles/37039/Sorting-Hashtable

                  【讨论】:

                    【解决方案12】:

                    【讨论】:

                      猜你喜欢
                      • 2020-06-30
                      • 2011-03-25
                      • 2017-12-13
                      • 2018-11-28
                      • 2015-01-01
                      • 2015-10-23
                      • 2010-10-29
                      • 2012-03-07
                      • 1970-01-01
                      相关资源
                      最近更新 更多