Ответ digEmAll, безусловно, является лучшим выбором на практике, так как он использует встроенный код, а не изобретает колесо. Но я оставлю это как пример реализации.
Вы можете использовать IEqualityComparer<HashSet<T>>
, который использует SetEquals
. Затем передайте его конструктору словаря. Что-то вроде следующего (не проверял):
class HashSetEqualityComparer<T>: IEqualityComparer<HashSet<T>>
{
public int GetHashCode(HashSet<T> hashSet)
{
if(hashSet == null)
return 0;
int h = 0x14345843; //some arbitrary number
foreach(T elem in hashSet)
{
h = unchecked(h + hashSet.Comparer.GetHashCode(elem));
}
return h;
}
public bool Equals(HashSet<T> set1, HashSet<T> set2)
{
if(set1 == set2)
return true;
if(set1 == null || set2 == null)
return false;
return set1.SetEquals(set2);
}
}
Обратите внимание, что хеш-функция здесь коммутативна, это важно, потому что порядок перечисления элементов в наборе не определен.
Еще один интересный момент заключается в том, что вы не можете просто использовать elem.GetHashCode
, поскольку это даст неверные результаты, если в набор был добавлен пользовательский компаратор равенства.