HashSet 是否保留枚举之间的顺序?

Age*_*ire 5 c# msdn sequence hashset

这个StackOverflow 答案完全描述了 aHashSet是无序的,它的项目枚举顺序是未定义的,不应依赖。

然而,

这就引出了另一个问题:我应该还是不应该依赖两个或多个后续枚举之间的枚举顺序?鉴于没有插入或删除。

例如,假设我向 HashSet 添加了一些项目:

HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
set.Add(4);
set.Add(5);
Run Code Online (Sandbox Code Playgroud)

现在,当我通过 枚举这个集合时foreach,假设我收到了这个序列:

// Result: 1, 3, 4, 5, 2.
Run Code Online (Sandbox Code Playgroud)

问题是:如果我没有修改,如果我再次枚举设置的时间和时间,订单会保留吗?会永远一样吗?

Bri*_*ley 4

实际上,枚举之间的值可能始终相同,但 IEnumerable 的描述中未提供该假设,并且实现者可以决定按其想要的顺序返回。

谁知道它在幕后在做什么,以及它将来是否会继续以同样的方式做。例如,HashSet 的未来实现可能会进行优化,以检测内存不足的情况并重新排列其在内存中的内容,从而影响它们返回的顺序。因此,99.9% 的情况下,它们会以相同的顺序返回,但如果您开始耗尽内存资源,它会突然以不同的顺序返回内容。

底线是我不会依赖枚举顺序随着时间的推移保持一致。如果顺序对您很重要,那么请重新执行 foreach set.OrderBy(x => x),以便确保它符合您想要的顺序。