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
值是否在另一条边的 left
或 right
字段中,并且如果一条边的 right
值edge 在 left
或 right
字段中。这会导致以下错误的 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
.
我有一个 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
值是否在另一条边的 left
或 right
字段中,并且如果一条边的 right
值edge 在 left
或 right
字段中。这会导致以下错误的 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
.