C#排队问题
假设我有一节课C#排队问题,c#,reference,queue,C#,Reference,Queue,假设我有一节课 XYNode { protected int mX; protected int mY; } 还有一个队列 Queue<XyNode> testQueue = new Queue<XYNode>(); 因为即使具有这些坐标的节点在队列中,我们也在针对不同的XYNode对象进行测试,因此它将始终返回false 正确的解决方案是什么?最简单的方法是覆盖Equals,这样一个XYNode知道它是否等于另一个XYNode。您应该同时重写GetH
XYNode
{
protected int mX;
protected int mY;
}
还有一个队列
Queue<XyNode> testQueue = new Queue<XYNode>();
因为即使具有这些坐标的节点在队列中,我们也在针对不同的XYNode对象进行测试,因此它将始终返回false
正确的解决方案是什么?最简单的方法是覆盖
Equals
,这样一个XYNode
知道它是否等于另一个XYNode
。您应该同时重写GetHashCode()
,并可能实现IEquatable
,以允许强类型的相等比较
或者,您可以编写一个IEqualityComparer
实现来比较任意两个节点,并返回它们是否相同,然后将其传递到调用枚举中定义的(假设您使用的是.NET 3.5)
需要考虑的其他事项:
- 您可以使用私有字段而不是受保护的字段吗
- 你的班级可以封缄吗
- 你的类是不变的吗
- 您的类是否应该改为结构?(判决电话…)
- 是否应该重载==和!=接线员
来说明Jon Skeet的。。。起初的答复:
class XYNode {
protected int mX;
protected int mY;
public override bool Equals(Object obj) {
if (obj == null || this.GetType() != obj.GetType()) { return false; }
XYNode otherNode = (XYNode)obj;
return (this.mX == other.mX) && (this.mY == other.mY);
}
}
这是一个相当简单的解决方案。还有很多额外的因素要考虑,Jon已经提到了。你可以简单地用一个foreach
迭代,检查你的XYNode
的X
和Y
在每个元素上。很快你就会赢得stackoverflow.com。我想Jon正试图获得足够的分数,把这个网站变成“BufferOverflow.com”您需要指定覆盖,并且参数应该是一个对象。使类密封的一个方便的方法是,您可以使用as/is而不是调用GetType()
——您不必担心被赋予子类实例。
class XYNode {
protected int mX;
protected int mY;
public override bool Equals(Object obj) {
if (obj == null || this.GetType() != obj.GetType()) { return false; }
XYNode otherNode = (XYNode)obj;
return (this.mX == other.mX) && (this.mY == other.mY);
}
}