对HashSet的LINQ顺序敏感操作是否具有确定性?

时间:2017-07-11 10:00:49

标签: c# linq

原始说明:

我正在处理单线程同步逻辑,我开始观察输出的一些差异,这取决于我是在调试模式还是在发布模式下运行代码。我开始怀疑缺乏决定论可以来自哪里。我大量使用LINQ,所以我想也许像HashSet这样没有固有排序的集合导致问题?

如果它们不具有确定性,会产生一些有趣的后果,例如,First()实际上是一个随机元素,可能会有一些非明显的概率分布...

进一步说明:

我不关心订购标准。具体来说,我不在乎它的插入顺序。我只询问是否在HashSet上的顺序敏感操作之间设置和共享顺序而没有任何更改。

举例说明:

我有一个创建HashSet的方法,而不是依赖于任何状态。它放入一些元素并返回First()。

  • 我是否保证方法调用之间始终是相同的元素?

  • 当整个应用程序终止并再次执行时,它是否是相同的元素?

如果对这些中的任何一个的答案都是否定的,那对我来说,从程序员的角度来看,对HashSet上的LINQ顺序敏感操作没有确定性。再一次,我没有要求知道订购标准(内部使用比较器)。

1 个答案:

答案 0 :(得分:2)

  

如果他们没有确定性,会有一些有趣的   结果,例如,First()实际上是随机的   元素可能有一些非明显的概率分布...

请务必注意,此处的两个选项不是已定义随机。事实上 - 已定义未定义未定义并不意味着随机不可预测 - 它必须意味着我保证不会

MSDN明确指出:

  

HashSet类提供高性能的集合操作。一套   是一个不包含重复元素的集合,是其中的   元素没有特别的顺序。 (强调我的)

如果您想确定关于订单(或者您希望它是确定性的),那么您需要使用OrderBy或其他类型(例如SortedSet )。