LINQ不会将两个对象视为不同

时间:2016-09-08 19:32:04

标签: c# linq reference distinct equals

我正在比较 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

我错过了一些相当明显的东西,不是吗?

2 个答案:

答案 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

来自Enumerable.Distinct()文档:

  

默认的相等比较器Default用于比较的值   实现IEquatable泛型接口的类型。至   比较自定义数据类型,您需要实现此接口和   为类型提供自己的GetHashCode和Equals方法。