字典似乎保持插入顺序

Mag*_*nus 6 c# dictionary .net-7.0

I\xe2\x80\x99ve 总是假设 aDictionary不保留添加项目的顺序。\n那么为什么这似乎总是正确的?

\n
internal class Program\n{\n    public static void Main()\n    {\n        var d = new Dictionary<int, int>();\n        var l = new List<int>();\n        var r = new Random();\n\n        for (int i = 1; i < 100_000; i++)\n        {\n            var j = r.Next();\n            if (!d.ContainsKey(j))\n            {\n                d.Add(j, 1);\n                l.Add(j);\n            }\n        }\n\n        Console.WriteLine(d.Select(kvp => kvp.Key).SequenceEqual(l));\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

can*_*on7 12

如果没有删除任何项目,当前的实现将保留插入顺序。然而,这并不能保证将来仍然如此。

请参阅例如文档

中的值的顺序Dictionary<TKey,TValue>.ValueCollection未指定

例如:

var dict = new Dictionary<string, string>();

dict.Add("A", "A");
dict.Add("B", "B");
dict.Remove("A");
dict.Add("C", "C");

Console.WriteLine(string.Join(" ", dict.Values)); // C B
Run Code Online (Sandbox Code Playgroud)

夏普实验室

(字典将键和值存储在条目数组中,迭代顺序是数组中条目的顺序。通常,项目会附加到数组中。但是,如果删除某个项目,则会创建一个空条目的链表新的插入被添加到第一个空条目中:这可以避免在删除条目时复制周围的所有内容。这会导致“C”被添加到第一个空条目中,该条目是在删除“A”时留下的。当然,这只是当前的实现,可能随时更改。)

  • *“[...]假设没有删除任何项目。”* -- 更准确地说,如果在删除至少一项后不再添加更多项目,则保留插入顺序。单独删除项目不会破坏剩余项目的顺序。 (3认同)