【发布时间】:2019-01-18 09:52:11
【问题描述】:
我知道有几个关于 HashSet 和订单保留的问题,非常简单的测试表明,如果添加和删除项目,订单将根本不会保留。
但我的问题明确涉及如果没有从 HashSet 中删除任何项目,是否保留插入顺序。
早在 2009 年 Jon Skeet (https://stackoverflow.com/a/657289/10894153) 就说过:
如果您从不移除任何项目,它可能会保留插入顺序。我不确定,但我不会完全感到惊讶。
他当时的理由是:
我没有查看内部结构或源代码(显然我没有)。
显然,这已经改变了,并且随着 .NET 现在是开源的,我想知道是否有人可以确定地验证插入顺序是否确实保留在 HashSet 上,而没有删除任何项目。
在问这个问题之前,我已经执行了几个 快速 测试,将 1000 个项目添加到 HashSet 并保留了插入顺序,但这绝不是证明它总是即使没有发生删除的情况。
编辑
正如 HimBromBeere 所指出的,HashSet 的官方文档声明不保留顺序,因此即使当前实现保持(尽管很明显它们确实不保证)插入顺序这可能会在未来发生变化。
话虽如此,我感兴趣的是在当前实现中没有发生删除时是否保持插入顺序(.NET 4.7.2)
【问题讨论】:
-
您应该从不依赖该顺序,这是一个实现细节,绝不保证在所有未来版本中都保持不变。
-
查看source-code 并证明自己。