集合是否有可能碎片化

本文关键字:碎片 有可能 是否 集合 | 更新日期: 2023-09-27 17:57:21

考虑在Dictionary中注册新成员的入口和进入时间:

Dictionary<string, DateTime> members = new Dictionary<string, DateTime>();
members.Add("Bob", DateTimeNow);
Thread.Sleep(1000);
members.Add("Joe", DateTimeNow);
Thread.Sleep(1000);
members.Add("Susan", DateTimeNow);
Thread.Sleep(1000);
// Now Joe exits
members.Remove("Joe");
// Then Mike enters
members.Add("Mike", DateTimeNow);

现在的问题是Mike Dictionary的位置在哪里.他是添加到Dictionary末尾还是将填充Susan的空白位置(如果我们使用 foreach 迭代或通过索引访问Dictionary)?行为是否一直得到保证?

集合是否有可能碎片化

字典

不是排序的,因此如果您迭代键,则无法对它们的返回顺序进行任何推理。

正如 MSDN 站点告诉我们的那样,字典是作为哈希表实现的,并且:

项目的顺序 返回未定义。

如果要按定义的顺序循环访问键,则应使用 SortedDictionary。

顺序的概念不是为字典所代表的哈希表定义的。您永远不能依赖按特定顺序排列的项目。不能保证此行为。字典用于按键快速访问给定项目。

引用文档:

为了枚举的目的,每个项目 在字典中被视为 KeyValuePair<TKey, TValue>结构 表示值及其键。这 退回物品的顺序 未定义。

访问Dictionary是通过key而不是通过index来完成的 - 所以它本身的问题意义不大。
正如所有答案已经说过的那样 - Dictionary没有顺序,通过Hashtable实现(维基页面 - 花时间阅读它)

它自己的Dictionary可以根据它维护的数据量和它自己的实现进行扩展压缩,但是当使用像.NET这样的丰富框架时,你不需要为这个问题而烦恼,它是为你完成的。如果您感兴趣,可以阅读 WIKI 页面中的Dynamic Resizing部分以了解实现。