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);
          }
      }