哈希争抢?

时间:2013-07-01 13:49:51

标签: c# hashtable

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

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

- 编辑 -

好的,我理解了原因,但我可以使用什么代替哈希表来保存插入顺序?

4 个答案:

答案 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 / ValueItem1 / 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了解差异。