提问人:Tobias 提问时间:4/13/2022 最后编辑:M. JustinTobias 更新时间:11/18/2023 访问量:82
C# 等于,但与顺序无关
C# equals but regardless of the order
问:
我有一个类 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 中。
我对我应该尝试什么有点一无所知。
答:
1赞
Progman
4/14/2022
#1
代码检查一条边的值是否位于另一条边的 or 字段中,以及一条边的值是否位于 or 字段中。这可能会导致以下错误检查: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
上一个:将名称与 ID 相关联
下一个:C# 等于,但与顺序无关
评论
Paris
Rom
Edge
public bool Equals(Edge other) => return left == other.left || right == other.right;
如果需要,您也可以覆盖==
Equals
equals = (left == edge.left && right == edge.right) || (left == edge.right && right == edge.left)
Node
Equals
GetHashCode
(left == edge.Left && right == edge.Right) || (left == edge.Right && right == edge.Left)