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

但是,这是我注意到的:

  • 在字典中添加了20个键值对
  • 通过执行foreach(KeyValuePair ...)来检索它们

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

    这是设计使然吗?

    最佳答案

    这是巧合,尽管可以预料的是。您绝对不应该依赖它。通常会在简单的情况下发生,但是如果您开始删除元素并将其替换为具有相同哈希码或只是进入相同存储桶的任何元素,则该元素将占据原始元素的位置,尽管添加的时间比其他元素晚。

    重现这个相对比较怪异,但我前阵子for another question做到了:

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

    结果显示10、1、2而不是1、2、10

    请注意,即使您不执行任何删除操作,即使当前行为看起来总是会按插入顺序产生元素,但也无法保证将来的实现也会这样做……因此即使在有限的情况下,您知道您会赢了不要删除任何内容,请不要依赖此内容。

  • 10-06 13:39
    查看更多