理解字典的无序本质
“无序字典”的概念可能看起来违反直觉,特别是在考虑诸如问题中提供。
插入顺序与密钥排序
.NET 中的字典本身并不通过插入或键值来保留元素的顺序。这与列表或数组不同,列表或数组的元素遵循定义的顺序。 “无序性”与键及其对应值之间缺乏预定义关系有关。
示例 1:变量插入顺序
以下代码演示了潜在的不确定性关于值的顺序:
var test = new Dictionary<int, string>(); test.Add(3, "three"); test.Add(2, "two"); test.Add(1, "one"); test.Add(0, "zero"); Console.WriteLine(test.ElementAt(0).Value);
预期输出取决于顺序的解释。一个人可能会假设“插入顺序”并期望“三”,而另一个人可能更喜欢“键顺序”并期望“零”。但是,需要注意的是,这两种顺序都无法保证。
示例 2:删除和重新哈希效果
删除和重新哈希可能会进一步影响此行为。例如,以下程序:
var test = new Dictionary<int, string>(); test.Add(3, "three"); test.Add(2, "two"); test.Add(1, "one"); test.Add(0, "zero"); test.Remove(2); test.Add(5, "five"); foreach (var pair in test) { Console.WriteLine(pair.Key); }
可能不一定会按预期输出序列 (3, 5, 1, 0)。由于重新哈希和其他内部优化,键值对可能会占据不同的位置。
结论
字典优先考虑基于键值映射的高效存储和检索,而不是比有序安排。虽然某些实现可能会表现出一些排序特征,但依赖这些行为是不明智的。始终将字典视为无序集合,即使它们当前看起来是有序的,以避免意外错误或不一致的结果。
以上是为什么 .NET 字典不保证插入或键顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!