集合是否可能变得支离破碎?

时间:2011-05-21 19:19:14

标签: c# collections fragmentation

考虑在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 via index)?这种行为是否一直保证?

3 个答案:

答案 0 :(得分:3)

字典不是有序的,所以如果你遍历键,你就不能对它们返回的顺序做任何推理。

正如MSDN网站告诉我们的那样,Dictionary实现为hash table,并且:

  

项目的顺序   返回是未定义的。

如果要按定义的顺序迭代键,则应使用SortedDictionary

答案 1 :(得分:1)

没有为Dictionary表示的哈希表定义顺序的概念。您永远不能依赖特定订单中的商品。这种行为无法保证。字典用于按键快速访问给定项目。

来自documentation

的引用
  

为了枚举,每个项目   在字典中被视为一个   KeyValuePair<TKey, TValue>结构   代表一个值及其关键。该   退货的订单   未定义。

答案 2 :(得分:1)

访问Dictionary是通过key而不是index完成的 - 所以自己的问题意味着更少。
由于已经说明了所有答案 - Dictionary没有订单,并且是通过HashtableWiki Page实施的 - 请花时间阅读)

Dictionary它自己可以 展开 压缩 ,具体取决于数据量维护和自己的实现,但是当使用像.NET这样的丰富框架时,您不需要为这个问题烦恼,它就是为您完成的。您可以阅读WIKI页面中的Dynamic Resizing部分,了解您感兴趣的实施情况。