Dictionary中元素的顺序

我的问题是关于枚举Dictionary元素

// Dictionary definition private Dictionary<string, string> _Dictionary = new Dictionary<string, string>(); // add values using add _Dictionary.Add("orange", "1"); _Dictionary.Add("apple", "4"); _Dictionary.Add("cucumber", "6"); // add values using [] _Dictionary["banana"] = 7; _Dictionary["pineapple"] = 7; // Now lets see how elements are returned by IEnumerator foreach (KeyValuePair<string, string> kvp in _Dictionary) { Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value)); } 

按照什么顺序列举的元素? 我可以强制命令是按字母顺序吗?

字典中元素的顺序是非确定性的。 订单的概念根本就没有为哈希表定义。 所以不要依赖元素添加到字典中的顺序来进行枚举。 这不能保证。

从doc引用:

为了枚举的目的,字典中的每个项目都被当作一个KeyValuePair<TKey, TValue>结构来表示一个值及其关键字。 项目返回的顺序是未定义的。

如果你想要的元素sorting,使用OrderedDictionary 。 一个普通的hastable /字典只是在某种意义上的存储布局。

我想我晚了,但你可以使用SortedDictionary 。 请注意,除非指定了比较器,否则缺省情况下该命令按键sorting。

我怀疑使用OrderedDictionary你想要什么,因为文档说

OrderedDictionary的元素不按键sorting,与SortedDictionary类的元素不同。

这些项目将按照它们恰好被存储在字典中的顺序被返回,这取决于哈希码和项目添加的顺序。 因此,顺序看起来是随机的,随着实现的变化,您不应该依赖于保持不变的顺序。

枚举项目时可以订购这些项目:

 foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { ... } 

在框架2.0中,您首先必须将这些项目放在列表中才能对它们进行sorting:

 List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary); items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); }); foreach (KeyValuePair<string,string> kvp in items) { ... } 

对于OrderedDictionary:

  var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary(); _OrderedDictionary.Add("testKey1", "testValue1"); _OrderedDictionary.Add("testKey2", "testValue2"); _OrderedDictionary.Add("testKey3", "testValue3"); var k = _OrderedDictionary.Keys.GetEnumerator(); var v = _OrderedDictionary.Values.GetEnumerator(); while (k.MoveNext() && v.MoveNext()) { var key = k.Current; var value = v.Current; } 

项目按照添加的顺序返回。

关联数组(又名哈希表)是无序的,这意味着元素可以以任何可以想象的方式sorting。

但是,你可以获取数组键(只有键),按字母顺序sorting(通过sortingfunction),然后工作。

我不能给你一个C#示例,因为我不知道这个语言,但这应该足以让你自己去做。