我有一个返回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;
}
}
答案 0 :(得分:18)
Hashtables通过将键映射到值来工作。此映射中隐含的概念是密钥未按任何特定顺序排序或存储。
但是,您可以查看SortedDictionary<K,V>
。
答案 1 :(得分:8)
另一种选择是构建你正在做的哈希表,然后简单地从键构造一个有序集。您可以遍历该排序的密钥集,根据需要从哈希表中获取相应的值。
答案 2 :(得分:6)
lubos是对的:你无法对HashTable进行排序。如果可以的话,它不会是HashTable。您可以枚举HashTable,然后对枚举进行排序。但那将是非常缓慢的。更好的是使用SortedDictionary
代替。
答案 3 :(得分:3)
抱歉,您无法对哈希表进行排序。您将不得不重构代码以使用某些可排序的集合。
答案 4 :(得分:2)
我很确定哈希表无法排序......;)
答案 5 :(得分:1)
您需要返回哈希表以外的其他内容。我不会重申您声称已经理解的内容,但您需要重新考虑您的设计中的任何部分都要求您在哈希表中返回已排序的对象。
答案 6 :(得分:1)
不完全是C#的答案,但我相信你可以做些什么。
在Perl中,通常将“排序”哈希表用于输出到显示器。
例如:
print "Items: ";
foreach (sort keys %items) {
print $_, '=', $items{$_}, ' ';
}
这里的技巧是Perl不对散列进行排序,它正在对复制的散列键列表进行排序。在C#中应该很容易将哈希键提取到列表中,然后对该列表进行排序。
答案 7 :(得分:0)
对哈希表进行排序没有意义,因为您已经拥有几乎恒定的查找时间。或者在最坏的情况下O(B)其中B是铲斗尺寸。
答案 8 :(得分:0)
当然可以对哈希表进行排序,但是您需要首先定义对哈希表进行排序的含义。 (这就是问题所在)
然而,一旦你完成了这个,你总是会删除散列表可以给你的所有优点,你也可以使用排序数组(使用二进制搜索),或者使用红黑树代替。
答案 9 :(得分:0)
我是一名新的程序员,所以我带着一丝盐说话。但这是我遇到类似情况时所做的。我创建了一个有两个变量的类,然后在这些变量上创建了一个List
对象,然后我使用linq对这些变量进行排序。
答案 10 :(得分:0)
您还可以使用DataView对Hashtable进行排序。这是我5年前写的一篇文章:http://www.codeproject.com/Articles/37039/Sorting-Hashtable
答案 11 :(得分:0)
虽然你不能对哈希表进行排序
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-7.1 类似于 Powershell 哈希表文档