ImmSet is an immutable hash set, implemented as an AVL tree, and it’s the library’s primary set collection. Elements must normally implement IEquatable<T>
.
It also has a sorted variant that uses IComparer<T>
and IComparable<T>
.
Examples
Operators
ImmSet supports the basic membership, addition, and removal operations. It also supports highly optimized set-theoretic operations. See Key Semantics when collections with custom comparison logic are involved.
- Union
- Intersection
- Except
- Symmetric difference, often called simply
Difference
. - ExceptInverse, which is the opposite of
Except
.
These operations take an IEnumerable<T>
, which taken to be a collection of elements. The operations are performed using the current instance’s membership semantics, even if the input is also a set with different membership semantics. Type testing is performed internally to determine the actual type of the input.
The input can contain duplicates. They are ignored.
These methods are highly optimized for compatible sets of the same type. See more about set compatiblity below. The methods are also optimized for other kinds of inputs. As always, iterators will give the worst performance.
Relations
The sets support set-theoretic relation operators, including:
IsSubsetOf
and related methods. These test for a specific relation.RelatesTo
, which returns an enum value indicating the relation between two sets.
The input is an IEnumerable<T>
here as well.
Complexity
Here is a rundown of the complexity of each operation, which just showcases what we’ve discussed previously:
ImmSet
and ImmSortedSet
have the same time complexity per operation, with the exception that ImmSet
is a hash set that uses buckets, and therefore the performance is averaged over the inputs, and assumes a decent GetHashCode
implementation.
Performance