15

我有一个返回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;
        }
    }
4

12 回答 12

18

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

不过,你可以看看SortedDictionary<K,V>.

于 2009-03-24T00:46:44.717 回答
9

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

于 2009-03-24T01:45:51.827 回答
7

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

于 2009-03-24T00:45:46.963 回答
3

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

于 2009-03-24T00:44:27.200 回答
1

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

维基百科哈希表

于 2009-03-24T00:45:00.320 回答
1

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

于 2009-03-24T00:53:21.347 回答
1

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

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

例如:

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

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

于 2009-03-24T02:00:02.543 回答
0

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

于 2009-03-24T00:46:23.063 回答
0

当然哈希表是可以排序的,但是你需要先定义对哈希表进行排序意味着什么。(这就是问题所在)

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

于 2009-03-24T01:50:13.377 回答
0

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

于 2012-08-02T20:59:28.407 回答
0

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

于 2014-08-08T05:55:31.557 回答
0

虽然你不能对哈希表进行排序

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-7.1 Powershell哈希表文档中的类似

于 2021-02-09T10:33:35.390 回答