Silverlight 3:使用foreach KeyValuePair的泛型Dictionary中的迭代顺序

时间:2010-02-08 12:26:27

标签: silverlight dictionary foreach generics

在Silverlight3中,当使用foreach和KeyValuePair迭代泛型词典时,迭代是否保证按照添加项目的顺序访问字典中的项目?也就是说,迭代序列与密钥的数据类型或其值无关?文档不是明确的:

此代码将生成类似的输出到以下内容:     http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx     (重点补充)

Dictionary<String, Object> 
foreach (KeyValuePair String, Object kvp in myDictionary) {}

Dictionary<UInt16, String> 
foreach (KeyValuePair UInt16, String kvp in myDictionary) {} 

由于

3 个答案:

答案 0 :(得分:2)

Dictionary的规范说迭代顺序是未定义的。所以你不应该依赖它。

现实情况是,如果使用Reflector等反编译实际实现,您将看到它使用值/键属性的后备数组(带有已删除项目的标记)。实现它的方式导致按照添加内容的顺序进行迭代。你不能依赖它。我想有很多人不知不觉地依赖于这种行为,所以我怀疑他们很快就会改变这种状态。不过,除了快速的一次性一次性代码之外,我仍然不想依赖它。

答案 1 :(得分:1)

迭代顺序取决于密钥的哈希码,并且与添加它们的顺序无关

答案 2 :(得分:1)

我不会使代码依赖于特定的排序顺序。如果您需要使用特定订单进行迭代的集合/字典,则应首先对其进行排序(使用Linq OrderBy方法)。即使您的代码今天很好,您也可能希望利用即将执行的任务并行,然后重新访问代码的实现细节。