原始说明:
我正在处理单线程同步逻辑,我开始观察输出的一些差异,这取决于我是在调试模式还是在发布模式下运行代码。我开始怀疑缺乏决定论可以来自哪里。我大量使用LINQ,所以我想也许像HashSet这样没有固有排序的集合导致问题?
如果它们不具有确定性,会产生一些有趣的后果,例如,First()实际上是一个随机元素,可能会有一些非明显的概率分布...
进一步说明:
我不关心订购标准。具体来说,我不在乎它的插入顺序。我只询问是否在HashSet上的顺序敏感操作之间设置和共享顺序而没有任何更改。
举例说明:
我有一个创建HashSet的方法,而不是依赖于任何状态。它放入一些元素并返回First()。
我是否保证方法调用之间始终是相同的元素?
当整个应用程序终止并再次执行时,它是否是相同的元素?
如果对这些中的任何一个的答案都是否定的,那对我来说,从程序员的角度来看,对HashSet上的LINQ顺序敏感操作没有确定性。再一次,我没有要求知道订购标准(内部使用比较器)。
答案 0 :(得分:2)
如果他们没有确定性,会有一些有趣的 结果,例如,First()实际上是随机的 元素可能有一些非明显的概率分布...
请务必注意,此处的两个选项不是已定义和随机。事实上 - 已定义和未定义。 未定义并不意味着随机或不可预测 - 它必须意味着我保证不会。
MSDN明确指出:
HashSet类提供高性能的集合操作。一套 是一个不包含重复元素的集合,是其中的 元素没有特别的顺序。 (强调我的)
如果您想确定关于订单(或者您希望它是确定性的),那么您需要使用OrderBy
或其他类型(例如SortedSet
)。