为什么.Net词典看起来像是经过排序的

本文关键字:经过 排序 看起来 Net 为什么 | 更新日期: 2023-09-27 18:28:44

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

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

我立即告诉我的同事,他的代码是错误的,因为Dictionary是一个哈希表,一个未排序的集合。我说,他应该使用一个保存顺序的集合,或者稍后用foreach从字典中读取项目时对其进行排序。

但他回答说:"不,不,我的代码是正确的!看:现在我添加了OrderBy,项目按正确的顺序出现。"

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

我告诉他不应该依赖这种行为,但他不同意,我很难解释为什么。此外,我很感兴趣的是,为什么秩序经常被保留下来。

所以我的问题是……为什么Dictionary,一个根本没有排序的集合,看起来如此像是排序的?

为什么.Net词典看起来像是经过排序的

它是排序的,因为Dictionary是如何实现的(在您的情况下,项目是按顺序添加的)。但这是实现的详细信息

告诉你的同事存在一个SortedDictionary类,这应该会让他相信我们不能依靠简单的Dictionary来订购物品;)

在字典上迭代时,您将按照插入字典的顺序获得字典中的项。

在本例中,对列表进行排序,然后依次将每个项目添加到字典中。

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

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

如果需要将Dictionary中的项目按特定顺序排列,则应使用SortedDictionary