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

时间:2016-04-10 13:32:40

标签: c# sequence hashset msdn

This StackOverflow答案完全描述了HashSet是无序的,其项目枚举顺序是未定义的,不应该依赖。

然而,

这带来了另一个问题:我是否应该依赖两个后续枚举之间的枚举顺序?鉴于没有插入或删除。

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

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

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

// Result: 1, 3, 4, 5, 2.

问题是:如果我在没有插入/删除的情况下再次枚举该组,那么该命令会保留吗? 它总是一样吗?

1 个答案:

答案 0 :(得分:2)

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

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

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