为什么.Net字典看起来像是排序的?

时间:2012-03-22 13:13:30

标签: c# .net sorting dictionary hashtable

我正在查看我的同事签入的一些代码,它看起来像这样:

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id);

我立刻告诉我的同事他的代码是错误的,因为Dictionary是一个哈希表,一个非排序的集合。他应该使用保留订单的集合,或者稍后在用foreach从字典中读取这些项目时对它们进行排序,我说。

但是他回答说“不,不,我的代码是正确的!看:现在我已经添加了OrderBy,这些项目按照正确的顺序显示。”

原来,在测试用例中,他是对的。我尝试了其他一些数据,但它仍然完美排序!

我告诉他,他不应该依赖这种行为,但他不同意,我无法解释原因。此外,我很感兴趣为什么订单似乎经常被保留。

所以我的问题是......为什么Dictionary,一个基本上没有排序的集合,看起来非常像它的排序?

2 个答案:

答案 0 :(得分:6)

它是按照Dictionary的实现方式进行排序的(在您的情况下,项目按顺序添加)。但这是实施细节

告诉你的同事有一个SortedDictionary课程,这应该说服他我们不能依靠简单Dictionary的商品订单;)

答案 1 :(得分:3)

在迭代字典时,您可以在the order they were inserted to the dictionary中获取其中的项目。

在示例中,列表被排序,然后每个项目依次添加到字典中。

最终结果是字典中的项目按列表的排序顺序排列。

然而,恰好是Dictionary当前实现的情况 - 不能保证它会保持这种状态。

如果您需要按特定顺序排列Dictionary项,则应使用SortedDictionary