C# Dictionary.Values.ToArray()的顺序是什么?
如果我向字典中添加值,然后在代码的后面某处添加值,我希望使用以下命令将该字典转换为数组:C# Dictionary.Values.ToArray()的顺序是什么?,c#,dictionary,C#,Dictionary,如果我向字典中添加值,然后在代码的后面某处添加值,我希望使用以下命令将该字典转换为数组: myDictionary.Values.ToArray() 数组会按照我输入的顺序显示吗?或者它是在某个阶段排序的?如果您想对值进行排序(在键上),那么您应该使用SortedDictionary或SortedList 对于普通字典,值的顺序取决于实现,但您也可以假设它是随机的 输入顺序丢失。返回值的顺序很可能(但不能保证)与存储键的顺序相同。正如Henk Holterman所提到的,这是特定于实现的,不应
myDictionary.Values.ToArray()
数组会按照我输入的顺序显示吗?或者它是在某个阶段排序的?如果您想对值进行排序(在键上),那么您应该使用
SortedDictionary
或SortedList
对于普通字典,值的顺序取决于实现,但您也可以假设它是随机的
输入顺序丢失。返回值的顺序很可能(但不能保证)与存储键的顺序相同。正如Henk Holterman所提到的,这是特定于实现的,不应依赖 这一点非常明确: 为便于枚举,每个项目 在字典中被视为 键值对结构 表示一个值及其键。这个 返回项目的顺序 没有定义 编辑字典可能会通过按添加顺序返回值来引诱您产生错误的安全感,但下面的通过测试表明,它的行为实际上要微妙得多:
[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);
}
[TestMethod]
公共void TestDictionary()
{
var Dictionary 1=新字典();
var dictionary2=新字典();
对于(int i=0;i<10;i++){
字典1[i]=i;
如果(i!=3)
字典2[i]=i;
}
字典1.移除(3);
词典1[3]=3;
字典2[3]=3;
集合Assert.AreEqual(新的[]{0,1,2,3,4,5,6,7,8,9},字典1.Values);
集合Assert.AreEqual(新的[]{0,1,2,4,5,6,7,8,9,3},字典2.Values);
}
如果仔细查看代码,您会发现字典中元素的顺序不是添加元素的顺序,而是最初添加元素的顺序
我不想想象随着时间的推移,多次插入和删除会发生什么。如果你依赖这种未记录的行为,我认为你将欠世界一个等价物。如果
myDictionary
是Dictionary
类型,那么顺序与键所使用的顺序相同,或者没有定义。特别是,它不能保证是插入顺序,或任何有用的顺序,甚至不能保证在同一应用程序的不同运行中是相同的顺序
未指定Dictionary.ValueCollection中值的顺序,但其顺序与keys属性返回的Dictionary.KeyCollection中关联键的顺序相同
什么样的词典?这本很有用。您可以通过new SortedDictionary(现有词典)将词典
转换为SortedDictionary
代码>