如何使用 HashSet 作为数学集合?
How to use HashSet as a mathematical set?
我尝试使用 HashSet
创建一个 数学集 。我有以下代码:
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();
}
}
好像HashSet
相等不合适,因为A
和B
必须被认为是相同的,但是对于HashSet来说它们是不同的对象。
如何重新定义 HashSet 的相等性?
您应该解释 .Net 如何比较您的自定义数据(HashSet<T>
在您的情况下) 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;
}
}
然后在创建时提到比较规则SET:
...
HashSet<HashSet<int>> SET = new HashSet<HashSet<int>>(new HashSetComparer<int>()) {
A, B
};
...
我尝试使用 HashSet
创建一个 数学集 。我有以下代码:
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();
}
}
好像HashSet
相等不合适,因为A
和B
必须被认为是相同的,但是对于HashSet来说它们是不同的对象。
如何重新定义 HashSet 的相等性?
您应该解释 .Net 如何比较您的自定义数据(HashSet<T>
在您的情况下) 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;
}
}
然后在创建时提到比较规则SET:
...
HashSet<HashSet<int>> SET = new HashSet<HashSet<int>>(new HashSetComparer<int>()) {
A, B
};
...