如果我要向字典中添加值,然后在稍后的代码中,我想使用将该字典转换为数组
myDictionary.Values.ToArray()
数组会按照我输入的顺序出现吗?还是在某个阶段被分类?
如果要对值进行排序(在Key上),则应使用SortedDictionary<K,V>
或SortedList<K,V>
对于普通的Dictionary,Values的顺序取决于实现,但您也可以假设它是随机的。
进入的顺序丢失。
返回值的顺序很可能(但不能保证)与存储键的顺序相同。正如Henk Holterman所提到的,这是针对具体实施的,不应依赖。
Dictionary的MSDN条目对此非常明确:
出于列举的目的,每个项目在字典中被视为KeyValuePair结构表示一个值及其键。这个退货的顺序未定义。
EDIT字典可能会通过看似按添加顺序返回值来引诱您产生虚假的安全感,但通过以下测试表明,它的行为实际上要微妙得多:
[TestMethod]
public void TestDictionary()
{
var dictionary1 = new Dictionary<int, int>();
var dictionary2 = new Dictionary<int, int>();
for(int i = 0; i < 10; i++){
dictionary1[i] = i;
if (i != 3)
dictionary2[i] = i;
}
dictionary1.Remove(3);
dictionary1[3] = 3;
dictionary2[3] = 3;
CollectionAssert.AreEqual(new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, dictionary1.Values);
CollectionAssert.AreEqual(new[] { 0, 1, 2, 4, 5, 6, 7, 8, 9, 3 }, dictionary2.Values);
}
如果你仔细查看代码,你会发现字典中元素的顺序不是添加元素的顺序,而是元素最初添加的顺序。
我不想想象随着时间的推移多次插入和删除会发生什么。如果你依赖这种无证行为,我认为你将欠世界相当于美国国债的不良代码补偿。
如果myDictionary
的类型为Dictionary<K,V>
,则顺序与Keys
使用的顺序相同,否则未定义。特别是,它不能保证是插入顺序,也不能保证是任何有用的顺序,甚至不能保证在同一应用程序的不同运行中是相同的顺序。
Dictionary.ValueCollection中的值的顺序未指定,但它与keys属性返回的Dictionary.KeyCollection中的关联键的顺序相同。
http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx