如果SetEquals等于HashSet <t> EqualityComparer,则返回相等:哪个GetHashCode?

时间:2018-10-18 14:56:52

标签: c# hashset gethashcode

似乎像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()?不能保证枚举元素的顺序

0 个答案:

没有答案