I try to create a mathematical set using HashSet
. I have the following code:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> A = new HashSet<int>() { 1, 2 };
HashSet<int> B = new HashSet<int>() { 1, 2 };
HashSet<HashSet<int>> SET = new HashSet<HashSet<int>>() { A, B };
// Desired: 1 (A and B are expected being equal)
// Actual: 2
Console.WriteLine(SET.Count);
Console.ReadKey();
}
}
It seems HashSet
equality is not suitable because A
and B
must be considered the same, but for HashSet they are different objects.
How can I redefine equality for HashSet?
CodePudding user response:
You should explain .Net how to compare your custom data (HashSet<T>
in your case) with a help of IEqualityComparer<T>
:
public sealed class HashSetComparer<T> : IEqualityComparer<HashSet<T>> {
public bool Equals(HashSet<T>? left, HashSet<T>? right) {
if (ReferenceEquals(left, right))
return true;
if (left == null || right == null)
return false;
return left.SetEquals(right);
}
public int GetHashCode(HashSet<T> item) {
//TODO: improve; simplest, but not that good implementation
return item == null ? -1 : item.Count;
}
}
then mention the comparing rules when creating SET:
...
HashSet<HashSet<int>> SET = new HashSet<HashSet<int>>(new HashSetComparer<int>()) {
A, B
};
...