我正在用C#编写一个程序 我有这样的代码
Hashtable ht = new Hashtable();
ht.Add("1", "One");
ht.Add("2", "Two");
ht.Add("3", "Three");
ht.Add("4", "Four");
但编译器对它进行排序 我想知道如何防止排序哈希表 请帮帮我
答案 0 :(得分:6)
HashTable
不进行排序。它会根据哈希码重新排列项目,因此不会保留原始顺序。
如果您想保留原始订单,或想要指定排序顺序,则不能仅使用HashTable
。
要指定其他排序顺序,您可以使用SortedDictionary<T>
。要保留原始订单,您可以将这些项目添加到Dictionary<T>
和List<T>
。
答案 1 :(得分:1)
编译器对它进行排序是什么意思?绝对没有排序。你是如何在项目上循环的?
我认为当你在键盘上循环时,物品的顺序无法保证 - &gt;
foreach(object key in hashtable.Keys){
...
}
但是根据您的问题,我认为您希望以与插入项目完全相同的顺序检索项目 - 也许最好的解决方案是保持密钥的并行列表;并从那里检索用于循环哈希表的密钥。
答案 2 :(得分:1)
改为使用Dictionary<int, string>
或Dictionary <string, string>
。
答案 3 :(得分:0)
做的时候:
Hashtable ht = new Hashtable();
ht.Add("1", "One");
ht.Add("2", "Two");
ht.Add("3", "Three");
ht.Add("4", "Four");
foreach (var k in ht.Keys)
{
Console.WriteLine(k);
}
我看不到任何类型的排序。
答案 4 :(得分:0)
哈希表不保留插入项的顺序。它们存储在没有“正确”顺序概念的数据结构中。您应该假设哈希表中的项目将以随机顺序存储。
如果项目的顺序很重要,您应该使用List或其他结构而不是Hashtable。
答案 5 :(得分:0)
试试这个:
Hashtable ht = new Hashtable();
ht.Add("1", "One");
ht.Add("2", "Two");
ht.Add("3", "Three");
ht.Add("4", "Four");
foreach (var k in ht.Keys.sort)
{
Console.WriteLine(k);
}
请注意sort
ht.Keys
答案 6 :(得分:0)
要获取按键排序的散列表中的值(它看起来像你想要的那样),请使用:
public List<string> GetOrderedValues(HashTable ht)
{
// Get a sorted list of keys
List<string> keys = new List<string>(ht.Keys.Cast<string>());
keys.Sort();
// Get values sorted by key
List<string> values = new List<string>();
foreach (string key in keys)
values.Add(ht[key]);
// Return Sorted Values
return values;
}
您还可以分割第一部分,然后您可以获得已排序键列表和已排序值列表。
另一个选项是返回一个KeyValuePair列表,它将按条目
排序然后,为什么不删除所有的ashle并首先用KeyValuePair列表替换你的哈希表?
答案 7 :(得分:0)
我找到了这个博客http://mctexpert.blogspot.com/2014/12/keeping-hash-table-in-order.html
具体来说,使用[Ordered]
将有助于保持原始排序:
$Hash = [Ordered]@{"Apple"="Red";
"Orange"="Orange";
"Banana"="Yellow";
"Pear"="Green";
"Blueberry"="Blue";
"Plum"="Purple"}