Dictionary中元素的顺序

时间:2010-10-24 10:01:40

标签: c# .net dictionary ienumerable

我的问题是关于枚举词典元素

// 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));
}

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

6 个答案:

答案 0 :(得分:109)

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

引用from the doc

  

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair<TKey, TValue>结构。返回项目的顺序未定义。

答案 1 :(得分:23)

如果您想要订购的元素,请使用OrderedDictionary。普通的hastable /字典仅在存储布局的某种意义上被排序。

答案 2 :(得分:22)

您可以随时使用SortedDictionary。请注意,默认情况下,字典按键排序,除非指定了比较器。

我对OrderedDictionary用于您想要的内容持怀疑态度,因为文档说明了这一点:

  

OrderedDictionary的元素不按键排序,不像   SortedDictionary类的元素。

答案 3 :(得分:12)

对于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;
}

项目按照添加顺序返回。

答案 4 :(得分:11)

项目将按照它们碰巧物理存储在字典中的顺序返回,这取决于哈希码和项目的添加顺序。因此,订单看起来是随机的,随着实施的改变,你永远不应该依赖于保持不变的订单。

您可以在枚举时订购商品:

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

在框架2.0中,您首先必须将项目放在列表中以对它们进行排序:

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) {
  ...
}

答案 5 :(得分:4)

关联数组(也称为哈希表)是无序的,这意味着可以以任何可想象的方式对元素进行排序。

但是,你可以获取数组键(只有键),按字母顺序排序(通过排序函数),然后处理它。

我不能给你一个C#样本,因为我不懂语言,但这应该足以让你自己继续。

相关问题