我的应用程序中有以下哈希表:
System.Collections.Hashtable colunas = new System.Collections.Hashtable();
colunas.Add("Nome", "Nome");
colunas.Add("Departamento", "Departamento");
colunas.Add("Cargo", "Cargo");
之后,我将此哈希表作为参数传递给函数,当我在foreach中传递哈希表时,得到以下结果:
Departamento
Nome
Cargo
为什么结果是按顺序而不是:
Nome
Departamento
Cargo
- 编辑 -
好的,我理解了原因,但我可以使用什么代替哈希表来保存插入顺序?
答案 0 :(得分:6)
哈希表不保留广告订单。
相反,它们使用基于键的哈希码的未指定顺序。
答案 1 :(得分:2)
Hashtable
表示根据密钥的哈希码组织的键/值对的集合。
答案 2 :(得分:2)
根据原始海报的要求,这个答案是根据评论“提升”的。
如果保持插入顺序很重要,您可能只想使用List<>
,其元素以某种方式成对字符串。两种解决方案都很自然:
var colunas = new List<KeyValuePair<string, string>>();
colunas.Add(new KeyValuePair<string, string>("Nome", "Nome"));
colunas.Add(new KeyValuePair<string, string>("Departamento", "Departamento"));
colunas.Add(new KeyValuePair<string, string>("Cargo", "Cargo"));
或:
var colunas = new List<Tuple<string, string>>();
colunas.Add(Tuple.Create("Nome", "Nome"));
colunas.Add(Tuple.Create("Departamento", "Departamento"));
colunas.Add(Tuple.Create("Cargo", "Cargo"));
KeyValuePair<,>
和Tuple<,>
之间存在技术差异,因为前者是struct
(值类型),后者是class
(引用类型),但是KeyValuePair<,>
和Tuple<,>
都是 不可变 类型,这可能并不重要。然后确定属性名称Key
/ Value
或Item1
/ Item2
是否最适合您的使用。
请注意,如果您使用此解决方案,则无法获得散列表提供的好处。您无法快速查找密钥。并且不能保证List<>
不能有许多具有相同“密钥”字符串的条目(该对的第一个组件)。该字符串甚至可以是null
。
如果 您想要对List<>
进行排序,在某些时候,调用colunas.Sort();
(没有给出比较器参数)将起作用适用于Tuple<,>
(词典顺序)但不适用于KeyValuePair<,>
。当然,如果您希望按键将一直按排序,您可以按照另一个答案的建议使用SortedDictionary<string, string>
。
答案 3 :(得分:1)
但我可以使用什么代替哈希表来保留插入顺序?
您可以选择:
System.Collections.Generic.SortedList<TKey, TValue>
System.Collections.Generic.SortedDictionary<TKey, TValue>
请参阅此处remarks section了解差异。