Does the HashSet
collection introduced in .NET 3.5 preserve insertion order when iterated using foreach
?
The documentation states, that the collection is not sorted, but it doesn't say anything about insertion order. A pre-release BCL blog entry states that it is unordered, but this article states that it is designed to preserve insertion order. My limited testing suggests, that order is preserved, but that could be a coincidence.
This HashSet MSDN page specifically says:
A set is a collection that contains no duplicate elements, and whose elements are in no particular order.
I think the article claiming it preserves ordering is just plain wrong. For simple tests the insertion order may well be preserved due to the internal structure, but it's not guaranteed and won't always work that way. I'll try to come up with a counterexample.
EDIT: Here's the counterexample:
using System; using System.Collections.Generic; class Test { static void Main() { var set = new HashSet<int>(); set.Add(1); set.Add(2); set.Add(3); set.Remove(2); set.Add(4); foreach (int x in set) { Console.WriteLine(x); } } }
This prints 1, 4, 3 despite 3 having been inserted before 4.
It's possible that if you never remove any items, it will preserve insertion order. I'm not sure, but I wouldn't be entirely surprised. However, I think it would be a very bad idea to rely on that:
string.GetHashCode
implementation not changing - which some people did back in the .NET 1.1 days, and then they got burned when the implementation did change in .NET 2.0...If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With