The order of elements in Dictionary
我的问题是关于枚举字典元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 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)); } |
元素的枚举顺序是什么?我可以强制按字母顺序排序吗?
字典中元素的顺序是不确定的。没有为哈希表定义简单的顺序概念。因此,不要依赖于与元素添加到字典中的顺序相同的枚举。这是不能保证的。
引用文档:
For purposes of enumeration, each item in the dictionary is treated as a
KeyValuePair structure representing a value and its key. The order in which the items are returned is undefined.
你总是可以用
我对使用
The elements of an OrderedDictionary are not sorted by the key, unlike
the elements of a SortedDictionary class.
如果要对元素进行排序,请使用orderedDictionary。普通的hastable/字典仅在某种意义上的存储布局中进行排序。
对于已订购的Dictionary:
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } |
项目按添加顺序返回。
这些项将按照它们碰巧存储在字典中的物理顺序返回,这取决于哈希代码和添加项的顺序。因此,顺序看起来是随机的,并且随着实现的改变,您不应该依赖保持不变的顺序。
枚举项时可以对其排序:
1 2 3 | foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { ... } |
在framework 2.0中,您首先必须将项目放入列表中,以便对它们进行排序:
1 2 3 4 5 | 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) { ... } |
关联数组(又称散列表)是无序的,这意味着元素可以以任何可能的方式进行排序。
但是,您可以获取数组键(仅键),按字母顺序排序(通过排序函数),然后进行处理。
我不能给你一个C样本,因为我不懂语言,但这应该足以让你自己去做。