是否可以对HashTable进行排序?

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

  ///  /// All content containers. ///  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; } } 

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

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

但是,您可以查看SortedDictionary

lubos是对的:你不能对HashTable进行排序。 如果可以的话,它不会是HashTable。 您可以枚举HashTable,然后对枚举进行排序。 但那会很慢。 更好的是使用SortedDictionary代替。

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

我很确定无法对哈希表进行排序…;)

维基百科哈希表

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

不完全是C#的答案,但我相信你可以做些什么。

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

例如:

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

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

排序哈希表没有意义,因为您已经有几乎恒定的查找时间。 或者在最坏的情况下O(B)其中B是铲斗尺寸。

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

但是,一旦你完成了这个,你总是会删除散列表可以给你的所有优点,你也可以使用排序数组(使用二进制搜索),或者使用红黑树代替。

我是一个新的程序员,所以把我说的一切都拿出来。 但这是我遇到类似情况时所做的。 我创建了一个具有两个变量的类,然后从这些变量创建了一个List对象,然后我使用linq对这些变量进行排序。

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