我正在比较 Triangle 类型的两个对象,显然它们被视为相等(我实现了我的自定义 GetHaschCode 以及 Equal 方法和算子)。
List<Triangle> triangles = ...;
bool same = triangles[0] == triangles[1];
// same is true
然而,当我在该列表上去 Distinct()时,它会保留所有元素(这听起来像是通过引用而不是我的自定义条件进行比较)。是这样的,我能做些什么呢?
int countBefore = triangles.Count();
int countAfter = triangles.Distinct().Count();
bool same = countBefore == countAfter;
// same is true, again
我错过了一些相当明显的东西,不是吗?
答案 0 :(得分:1)
您可以通过以下两种方式之一来实现这一目标......
安德鲁说要么实施IEquatable
public class Triangle : IEquatable<Triangle>
{
bool IEquatable<Triangle>.Equals(Triangle other)
{
return Equals(other);
}
public override bool Equals(object obj)
{
//...
}
public override int GetHashCode()
{
//...
}
}
或者您可以创建另一个实现IEqualityComparer(T)的类,并将其传递给Distinct方法调用。
public class TriangleComparer : IEqualityComparer<Triangle>
{
public bool Equals(Triangle x, Triangle y)
{
return x.Equals(y);
}
public int GetHashCode(Triangle obj)
{
return obj.GetHashCode();
}
}
答案 1 :(得分:0)
您需要在Triangle类中实现IEquatable(T) interface。
默认的相等比较器Default用于比较的值 实现IEquatable泛型接口的类型。至 比较自定义数据类型,您需要实现此接口和 为类型提供自己的GetHashCode和Equals方法。