关于C#:字典中元素的顺序

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.


你总是可以用SortedDictionary来实现。请注意,除非指定了比较器,否则字典默认按键排序。

我对使用OrderedDictionary来满足您的需求持怀疑态度,因为文档中说:

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样本,因为我不懂语言,但这应该足以让你自己去做。