C# 等于但不考虑顺序

C# equals but regardless of the order

我有一个 class 看起来像下面的边

class Edge 
{
    public Node left { get; private set; }
    public Node right { get; private set; }
    public int Costs { get; private set; }
}

我想写一个等号,无论顺序如何,return都是真的。因此,当左侧为 'Paris' 右侧为 'Rom' 时,如果它与右侧为 'Paris' 左侧为 'Rom' 的边缘进行比较,我希望 return 为真。 =12=]

'Rom' 和 'Paris' 是节点 class 的名称。节点 class 只有一个名称字段。

我试过这样写自己的 equals

  public override bool Equals(object obj)
    {
        return obj is Edge edge &&
               (EqualityComparer<Node>.Default.Equals(left, edge.left) || EqualityComparer<Node>.Default.Equals(right, edge.left)) &&
               (EqualityComparer<Node>.Default.Equals(right, edge.right) || EqualityComparer<Node>.Default.Equals(right, edge.left));
    }

然后我将边添加到边的哈希集中。

我有点不知道我应该尝试什么。

您的代码检查一条边的 left 值是否在另一条边的 leftright 字段中,并且如果一条边的 right 值edge 在 leftright 字段中。这会导致以下错误的 Equals() 检查:

edge 1: (42, 50)
            / |
           /  |   
          /   |
edge 2: (50, 50)

在这种情况下,您会发现一个“十字”link 和一个“直”link,具体取决于您从哪里开始调用 Equals()。但是支票应该是“交叉”或“直线”。

您可以更改 Equals() 方法中的检查,如下所示:

public sealed override bool Equals(object obj)
{
    return obj is Edge edge &&
           (
               (
                   // L1 == L2 && R1 == R2
                   EqualityComparer<Node>.Default.Equals(Left, edge.Left) &&
                   EqualityComparer<Node>.Default.Equals(Right, edge.Right)
               ) ||
               (
                   // L1 == R2 && R1 == L2
                   EqualityComparer<Node>.Default.Equals(Left, edge.Right) &&
                   EqualityComparer<Node>.Default.Equals(Right, edge.Left)
               )
           );
}

第一个块检查是否 Left 转到另一个 Left 并且 Right 转到另一个 Right。第二个块检查“交叉”部分,其中一个 Left 转到另一个 Right,一个 Right 转到另一个 Left.