Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ不认为两个相等的物体是不同的_C#_Linq_Reference_Distinct_Equals - Fatal编程技术网

C# LINQ不认为两个相等的物体是不同的

C# LINQ不认为两个相等的物体是不同的,c#,linq,reference,distinct,equals,C#,Linq,Reference,Distinct,Equals,我正在比较两个三角形类型的对象,显然它们是相等的(我实现了我的自定义GetHaschCode以及相等方法和运算符) 我遗漏了一些非常明显的东西,不是吗?您需要在Triangle类中实现 从文件中: 默认相等比较器default用于比较 实现IEquatable泛型接口的类型。到 比较自定义数据类型,您需要实现此接口和 为类型提供您自己的GetHashCode和Equals方法 你可以用两种方法中的一种 正如Andrew所说,这两种方法都是可行的 public class Triangle : I

我正在比较两个三角形类型的对象,显然它们是相等的(我实现了我的自定义GetHaschCode以及相等方法和运算符)

我遗漏了一些非常明显的东西,不是吗?

您需要在Triangle类中实现

从文件中:

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


你可以用两种方法中的一种

正如Andrew所说,这两种方法都是可行的

public class Triangle : IEquatable<Triangle>
{
    bool IEquatable<Triangle>.Equals(Triangle other)
    {
        return Equals(other);
    }

    public override bool Equals(object obj)
    {
        //...
    }

    public override int GetHashCode()
    {
        //...
    }
}
公共类三角形:IEquatable
{
布尔等式等于(其他三角形)
{
回报等于(其他);
}
公共覆盖布尔等于(对象对象对象)
{
//...
}
公共覆盖int GetHashCode()
{
//...
}
}
或者您可以创建另一个实现的类,并将其传递到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();
    }
}
公共类三角形比较程序:IEqualityComparer
{
公共布尔等于(三角形x,三角形y)
{
返回x等于(y);
}
公共int GetHashCode(三角形obj)
{
返回obj.GetHashCode();
}
}

Hmm,你能给出一个可重复的例子吗?听起来像是不正确的
GetHashCode
实现。这不会有帮助。如果在
Triangle
类中正确实现了
Equals
GetHashCode
重写,
Distinct
将在没有
IEqualtable
的情况下正常工作。如果您的
GetHasCode
不正确,那么实现该接口不会改变任何事情。只要把课程代码贴出来,我们就会告诉你出了什么问题。请看,如果您返回不同的散列码,您的
Equals
方法将根本不会被调用。@IvanStoev请将其作为回复发布,以便我可以接受它。你说得对,伙计。你也可以从我上面的评论中提到一些东西,使答案对后代更加有用。天才是愚蠢的@谢谢你,伙计,但我已经看过很多次了,我很确定这是个骗局。例如,他确实解释了所有这些。@IvanStoev似乎是这样,是的。事实上,我可以看到我投了一些答案,所以我一定看到了。但是,没有建立连接,呵呵。我已经有了公共覆盖bool Equals(对象输入)。这还不够吗?让那个和公共bool都相等(三角其他)可能是多余的吗?我更新了我的答案。至于为什么C#中会出现这种情况,请注意,文档是不正确的。如果类未实现
IEquatable
,默认的相等比较器将使用
object.Equals
object.GetHashCode
覆盖。请参阅中的
ObjectEqualityComparer
。恐怕还有其他问题。我在Triangle类中实现了IEquatable,并按照Resharper的建议添加了第二个Equal方法。同样的结果,虽然…奇怪,我刚刚测试了它,得到了与Ivan和Ed相同的结果。你的Equals或GetHashCode方法可能有问题。我想知道它应该是bool IEquatable。Equals(三角形其他)还是bool Equals(三角形其他)正如Resharper所建议的那样。这取决于您是否希望通过必须首先强制转换到接口(显式实现)或不强制转换到接口(隐式实现)来调用该方法-它也取决于用法,但由于它只将在不同的调用中使用,所以显式实现它可能是有意义的
public class Triangle : IEquatable<Triangle>
{
    bool IEquatable<Triangle>.Equals(Triangle other)
    {
        return Equals(other);
    }

    public override bool Equals(object obj)
    {
        //...
    }

    public override int GetHashCode()
    {
        //...
    }
}
public class TriangleComparer : IEqualityComparer<Triangle>
{
    public bool Equals(Triangle x, Triangle y)
    {
        return x.Equals(y);
    }

    public int GetHashCode(Triangle obj)
    {
        return obj.GetHashCode();
    }
}