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