collections.Contains(T)方法
我使用的是
System.Collections.Generic
,它包含我写的类的实例。
我已经读过,集合.Contains
方法使用object.Equals()
,或者来自IEquatable
接口的Equals()
方法的实现。
我已经覆盖了对象方法,以及从界面实现。但是,Queue.Contains(instance)
总是返回false。我究竟做错了什么?
例如...
class Foo : IEquatable<Foo>
{
...
int fooField1;
...
public override bool Equals(object obj)
{
Foo other = obj as Foo;
bool isEqual = false;
if (other.fooField1 == this.fooField1)
{
isEqual = true;
}
return isEqual;
}
public bool Equals(Foo other)
{
bool isEqual = false;
if (other.fooField1 == this.fooField1)
{
isEqual = true;
}
return isEqual;
}
}
...
void SomeFunction()
{
Queue<Foo> Q = new Queue<Foo>();
Foo fooInstance1 = new Foo();
Foo fooInstance2 = new Foo();
fooInstance1.fooField1 = 5;
fooInstance2.fooField1 = 5;
Q.Enqueue(fooInstanec1);
if(Q.Contains(fooInstance2) == false)
{
Q.Enqueue(fooInstance2);
}
}
fooInstance2始终添加到队列中。实际上,当我在调试器上运行它时,永远不会达到Equals的实现。
我究竟做错了什么?
没有找到相关结果
已邀请:
4 个回复
盟犯涩沟都
橙绥
鞋扣蚊冈借
你在那里更新了
两次。第二行应该说
。 一旦修复,
按预期返回
。 除此之外,您不一定需要实施
。每个对象都有一个可覆盖的
方法。你可以简单地覆盖它。实现自己的比较方法时要小心。此示例中显示的实现对NullReference异常非常开放。这样的事情会更好:
正如其他人所提到的,如果你走这条路并覆盖
,你也应该覆盖
。您还应该考虑其他一些事情。有关详细信息,请参阅此MSDN页面。
拈吉勉犬姆