C# 等于,但与顺序无关

C# equals but regardless of the order

提问人:Tobias 提问时间:4/13/2022 最后编辑:M. JustinTobias 更新时间:11/18/2023 访问量:82

问:

我有一个类 Edge,如下所示

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

我想写一个等于,无论顺序如何,它都返回 true。因此,当左边是“Paris”,右边是“Rom”时,如果它与右边是“Paris”,左边是“Rom”的边相比,我想返回 true。

“Rom”和“Paris”是 Node 类的名称。节点类只有一个名称字段。

我试着这样写我自己的平等

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

我将边添加到边的 HashSet 中。

我对我应该尝试什么有点一无所知。

C# 相等

评论

0赞 JamesS 4/13/2022
这是Gunna需要更多信息。什么是属性/它们是什么?这是如何使用的?我们在比较什么?ParisRomEdge
1赞 MindSwipe 4/13/2022
public bool Equals(Edge other) => return left == other.left || right == other.right;如果需要,您也可以覆盖 ==
2赞 Keith.Abramo 4/13/2022
这感觉就像一个你试图让 SO 为你解决的类问题。到目前为止,您尝试过什么?你被困在哪里了?
3赞 500 - Internal Server Error 4/13/2022
你需要像(伪代码)这样。Equalsequals = (left == edge.left && right == edge.right) || (left == edge.right && right == edge.left)
1赞 juharr 4/13/2022
一个问题是,如果类不覆盖 和 ,则可能会对类进行引用相等。第二个问题是你的逻辑。你想要NodeEqualsGetHashCode(left == edge.Left && right == edge.Right) || (left == edge.Right && right == edge.Left)

答:

1赞 Progman 4/14/2022 #1

代码检查一条边的值是否位于另一条边的 or 字段中,以及一条边的值是否位于 or 字段中。这可能会导致以下错误检查:leftleftrightrightleftrightEquals()

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

在这种情况下,您会找到一个“交叉”链接和一个“直线”链接,具体取决于您从哪里开始通话。但是检查应该既是“交叉”,要么都是“直”。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)
               )
           );
}

第一个块检查一个块是否转到另一个块,一个块是否转到另一个块。第二个块检查“交叉”部分,其中一个转到另一个,一个转到另一个。LeftLeftRightRightLeftRightRightLeft