0

我的应用程序上有以下哈希表:

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

- 编辑 -

好的,我明白了原因,但是我可以使用什么来代替 hashtable 来保留插入顺序?

4

4 回答 4

6

哈希表不保留插入顺序。

相反,他们使用基于键的哈希码的未指定顺序。

于 2013-07-01T13:51:15.503 回答
2

Hashtable表示基于键的哈希码组织的键/值对的集合。

于 2013-07-01T13:52:26.527 回答
2

这个答案是根据原始海报的要求从评论中“提升”的。

如果保持插入顺序对您很重要,您可能只想使用 a 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/ValueItem1/Item2是否最适合您的使用。

请注意,如果您使用此解决方案,您将无法获得哈希表提供的好处。您无法快速查找密钥。并且不能保证List<>不能有许多具有相同“键”字符串(该对的第一个组件)的条目。那个字符串甚至可以是null.

List<>毕竟,如果colunas.Sort();对. 当然,如果您希望始终按键对集合进行排序,按照另一个答案的建议使用。Tuple<,>KeyValuePair<,>SortedDictionary<string, string>

于 2013-07-01T21:13:24.953 回答
1

但是我可以用什么代替哈希表来保留插入顺序?

你有一个选择:

  • System.Collections.Generic.SortedList<TKey, TValue>
  • System.Collections.Generic.SortedDictionary<TKey, TValue>

有关差异,请参见此处的备注部分。

于 2013-07-01T14:05:19.753 回答