C# 相等,但与顺序无关

问题描述 投票:0回答:1

我有一个 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));
    }

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

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

c# equality
1个回答
1
投票

您可以通过代码检查一条边的

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

© www.soinside.com 2019 - 2024. All rights reserved.