c#命令保留数据结构
奇怪的是,MSDN没有关于数据结构的保持属性的信息。 所以我一直在假设:
- Hashtable和Hashset不保留插入顺序(也就是“散列”中有赠品)
- 字典和列表DO保留插入顺序。
从这里我推断,如果我有一个定义曲线的Dictionary foo
,foo.Keys.ToList()和foo.Values.ToList()将给我一个有关的曲线范围和域的列表没有弄乱它吗?
您不应期望常规Dictionary
的键或值可以按任何顺序维护。 在SortedDictionary
,键和值按键的值按顺序维护 – 这与插入顺序不同 。
.NET框架中唯一保留插入顺序的内置字典是System.Collections.Specialized.OrderedDictionary
。 不幸的是,这个类不是通用的 – 但是,围绕它编写通用包装并不是非常困难。 请记住,在处理值类型(如int
或double
)时,它将导致键/值的装箱(通用词典不会对值类型施加装箱)。
正如@Anton所指出的那样, Dictionary
是一个无序的集合。 正确返回你的价值观是巧合,最终会失败。 如果您需要有一个有序的哈希表,您应该使用SortedDictionary
无论如何,依靠Dictionary
来保持秩序!
虽然Dictionary
明确指出枚举排序未定义,但我们测试它确实保留了插入排序(至少只要你不从中删除项目)。 如果有人可以提供反驳它的测试,我们会非常感兴趣,因为我们的生产代码依赖于它。
您可以采用相同的方法,为自己节省一些精力,为客户节省一些钱。
当然,Microsoft可能会在未来的.NET版本中更改Dictionary实现,但如果发生这种情况,您的自动化测试会检测到它,并且您可以在那时用另一个容器替换Dictionary,对吧?