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

C# HashSet是否保留枚举之间的顺序?,c#,sequence,hashset,msdn,C#,Sequence,Hashset,Msdn,StackOverflow answer完全描述了哈希集是无序的,其项枚举顺序是未定义的,不应依赖 但是, 这就引出了另一个问题:我是否应该依赖于两个或多个sebequent枚举之间的枚举顺序?假设没有插入或删除 例如,假设我已将一些项添加到哈希集: HashSet<int> set = new HashSet<int>(); set.Add(1); set.Add(2); set.Add(3); set.Add(4); set.Add(5); 问题是:如果我一次又一次

StackOverflow answer完全描述了
哈希集
是无序的,其项枚举顺序是未定义的,不应依赖

但是,

这就引出了另一个问题:我是否应该依赖于两个或多个sebequent枚举之间的枚举顺序?假设没有插入或删除

例如,假设我已将一些项添加到哈希集:

HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
set.Add(4);
set.Add(5);

问题是:如果我一次又一次地枚举设置的次数,并且不做任何修改,那么顺序会保持不变吗是否总是相同的

实际上,枚举之间可能总是相同的,但IEnumerable的描述中没有提供该假设,实现者可以决定按其想要的顺序返回

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


底线是,我不会依赖于枚举顺序随时间的变化而保持一致。如果顺序对您很重要,那么对set.OrderBy(x=>x)执行foreach,这样您就可以确保它符合您想要的顺序。

即使这是真的,也应该记录下来。既然不是,我就不信了。随着未来框架的更新,它可能会在任何时候打断您的脸。如果需要有保证的枚举顺序,那么究竟为什么要使用哈希呢。这绝对是错误的数据结构,根据您的需求,您选择对数据进行建模。由于哈希集基本上是一个具有固定时隙顺序的哈希表,是的,如果您根本不修改该集,则迭代顺序是恒定的。你应该相信吗?不,我不这么认为,你应该避免依赖它。好吧,我试着只依赖一个集合的两个后续枚举的顺序,仅此而已。我需要的数据结构是O(1)add/remove加上上面问题的肯定答案。是否有?拉取GetEnumerator()的实现并自己做出判断。当前的实现每次都会产生相同的顺序,只要没有对哈希集进行更新。我相信这就是你问题的答案。无法保证哈希集在下一个.NET修补程序之后会做什么,这就是未记录行为的含义,它可以毫无理由地更改。
// Result: 1, 3, 4, 5, 2.