我正在查看我的同事签入的一些代码,它看起来像这样:
return list.OrderBy(item => item.Order).ToDictionary(item => item.Id);
我立刻告诉我的同事他的代码是错误的,因为Dictionary
是一个哈希表,一个非排序的集合。他应该使用保留订单的集合,或者稍后在用foreach
从字典中读取这些项目时对它们进行排序,我说。
但是他回答说“不,不,我的代码是正确的!看:现在我已经添加了OrderBy
,这些项目按照正确的顺序显示。”
原来,在测试用例中,他是对的。我尝试了其他一些数据,但它仍然完美排序!
我告诉他,他不应该依赖这种行为,但他不同意,我无法解释原因。此外,我很感兴趣为什么订单似乎经常被保留。
所以我的问题是......为什么Dictionary
,一个基本上没有排序的集合,看起来非常像它的排序?
答案 0 :(得分:6)
它是按照Dictionary
的实现方式进行排序的(在您的情况下,项目按顺序添加)。但这是实施细节。
告诉你的同事有一个SortedDictionary课程,这应该说服他我们不能依靠简单Dictionary
的商品订单;)
答案 1 :(得分:3)
在迭代字典时,您可以在the order they were inserted to the dictionary中获取其中的项目。
在示例中,列表被排序,然后每个项目依次添加到字典中。
最终结果是字典中的项目按列表的排序顺序排列。
然而,恰好是Dictionary
当前实现的情况 - 不能保证它会保持这种状态。
如果您需要按特定顺序排列Dictionary
项,则应使用SortedDictionary
。