似乎像How does HashSet Compare elements for equality,但有所不同,因为该问题集中在HashSet使用的IEqualityComparer上。我想编写一个平等比较器,如果SetEquals
返回true,则声明两个哈希集相等;
我有一个类MyClass
和一个特殊的IEqualityComparer<MyClass>
,可以按值进行比较:MyClass
的两个对象的属性值相等时就相等。
我创建了一个HashSet<MyClass>
,使用此EqualityComparer检查是否相等。而且我想创建一个HashSetComparer(最好是通用类),如果SetEquals
返回true,则返回相等。
一些代码:
var someData = ..
var myClass1 = new MyClass(someData);
var myClass2 = new MyClass(someData);
通常这些对象不相等(引用相等)
IQualityComparer<MyClass> defaultComparer = EqualityComparer<MyClass>.Default;
Assert.IsFalse(defaultComparer.Equals(myClass1, myClass2));
但是如果使用我的EqualityCompare,则对象看起来是相等的
IQualityComparer<MyClass> valueComparer = ...
Assert.IsTrue(valueComparer.Equals(myClass1, myClass2));
因此比较器工作正常。让我们创建一些HashSet:
// two unequal MyClass object
MyClass my1 = ...
MyClass my2 = ...
Assert.IsFalse(valueComparer.Equals(my1, my2);
var sequence1 = new MyClass[] {my1, my2};
var sequence2 = new MyClass[] {my2, my1};
var sequence3 = new MyClass[] {my1, my1, my2, my1, my2, my2}
var set1 = new HashSet<MyClass>(sequence1, valueComparer);
var set2 = new HashSet<MyClass>(sequence2, valueComparer);
var set3 = new HashSet<MyClass>(sequence3, valueComparer);
所有三个集合将具有两个元素。使用valueComparer,一个等于my1
,另一个等于my2
。 hashSet没有定义的设置顺序。
Assert.IsTrue(set1.SetEquals(set2);
Assert.IsTrue(set1.SetEquals(set3);
我想创建一个相等比较器,声明两个具有SetQual
的集合相等。
相等函数很简单:
public bool Equals(HashSet<MyClass> x, HashSet<MyClass> y)
{
if (x == null) return y == null; // both x and y null
if (y == null) return false; // y null, but x not null
if (object.ReferenceEquals(x, y)) return true; // x and y same object
if (x.GetType() != y.GetType()) return false; // x and y different type
return x.SetEquals(y);
}
但是如何编写适当的GetHashCode()?不能保证枚举元素的顺序