为什么.Net词典看起来像是经过排序的
本文关键字:经过 排序 看起来 Net 为什么 | 更新日期: 2023-09-27 18:28:44
我正在查看我的同事签入的一些代码,它看起来像这样:
return list.OrderBy(item => item.Order).ToDictionary(item => item.Id);
我立即告诉我的同事,他的代码是错误的,因为Dictionary
是一个哈希表,一个未排序的集合。我说,他应该使用一个保存顺序的集合,或者稍后用foreach
从字典中读取项目时对其进行排序。
但他回答说:"不,不,我的代码是正确的!看:现在我添加了OrderBy
,项目按正确的顺序出现。"
事实证明,在测试用例中,他是对的。我尝试了一些其他数据,但它仍然是完美的排序!
我告诉他不应该依赖这种行为,但他不同意,我很难解释为什么。此外,我很感兴趣的是,为什么秩序经常被保留下来。
所以我的问题是……为什么Dictionary
,一个根本没有排序的集合,看起来如此像是排序的?
它是排序的,因为Dictionary
是如何实现的(在您的情况下,项目是按顺序添加的)。但这是实现的详细信息。
告诉你的同事存在一个SortedDictionary类,这应该会让他相信我们不能依靠简单的Dictionary
来订购物品;)
在字典上迭代时,您将按照插入字典的顺序获得字典中的项。
在本例中,对列表进行排序,然后依次将每个项目添加到字典中。
最终的结果是字典中的项目按照列表的排序顺序排列。
然而,Dictionary
的当前实现恰好就是这种情况——不能保证它会保持这种状态。
如果需要将Dictionary
中的项目按特定顺序排列,则应使用SortedDictionary
。