Does the .NET BCL have an immutable Set type? I’m programming in a functional dialect of C# and would like to do something like
new Set.UnionWith(A).UnionWith(B).UnionWith(C)
But the best I can find is HashSet.UnionWith, which would require the following sequence of calls:
HashSet composite = new HashSet();
composite.UnionWith(A);
composite.UnionWith(B);
composite.UnionWith(C);
This use is highly referentially opaque, making it hard to optimize and understand. Is there a better way to do this without writing a custom functional set type?
Update
This answer was written some time ago, and since then a set of immutable collections have been introduced in the
System.Collections.Immutablenamespace.Original answer
You can roll out your own method for this:
Use it like this:
You can also use LINQ’s
Union, but to get a set, you’ll need to pass the result to theHashSetconstructor:But,
HashSetitself is mutable. You could try to use F#’s immutable set.Also, as mentioned in the comments by ErikE, using
Concatyields the same result and probably performs better: