我有一个 Edge 类,如下所示
class Edge
{
public Node left { get; private set; }
public Node right { get; private set; }
public int Costs { get; private set; }
}
我想写一个无论顺序如何都返回 true 的 equals 。因此,当左边是“Paris”而右边是“Rom”时,如果它与右边是“Paris”而左边是“Rom”的 Edge 进行比较,我想返回 true。
'Rom' 和 'Paris' 是 Node 类的名称。节点类只有一个名称字段。
我试着写我自己的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
值是否在另一条边的 left
或 right
字段中,以及一条边的 right
值是否在 left
或 right
中场地。这可能会导致以下错误的 Equals()
检查:
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)
)
);
}
第一个块检查一个
Left
是否转到另一个 Left
,以及一个 Right
是否转到另一个 Right
。第二个块检查“交叉”部分,其中一个 Left
转到另一个 Right
,而一个 Right
转到另一个 Left
。