字典的枚举器<TKey,TValue>是否按照添加的顺序返回键值对?

Sha*_*bie 17 .net c# collections

我知道字典不是有序集合,不应该依赖于字典中插入和检索的顺序.

但是,这是我注意到的:

  • 为Dictionary添加了20个键值对
  • 通过做foreach(KeyValuePair ...)检索它们

检索顺序与添加顺序相同.测试了大约16个键值对.

这是设计的吗?

Jon*_*eet 28

虽然可以预见,但这只是巧合.你绝对不应该依赖它.通常它在简单的情况下发生,但是如果你开始删除元素并用任何具有相同哈希码的东西替换它们或只是进入同一个桶,那么该元素将采用原始位置,尽管比其他元素更晚添加.

重现这一点是相对繁琐的,但我在不久前设法做了另一个问题:

using System;
using System.Collections.Generic;

class Test
{
    static void Main(string[] args)
    {
        var dict = new Dictionary<int, int>();        
        dict.Add(0, 0);
        dict.Add(1, 1);
        dict.Add(2, 2);
        dict.Remove(0);
        dict.Add(10, 10);

        foreach (var entry in dict)
        {
            Console.WriteLine(entry.Key);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果显示10,1,2而不是1,2,10.

请注意,即使看起来当前行为总是会在插入顺序中产生元素,如果你不执行任何删除,也不能保证未来的实现会做同样的事情......所以即使在你知道你赢了的限制情况下也是如此不删除任何东西,请不要依赖于此.

  • +1 - 这个例子帮助我重现了我的场景中的行为,所以我可以"看到"它在行动,帮助我避免潜在的陷阱. (4认同)

Pet*_*den 22

来自MSDN:

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

[强调补充]