验证一对在两个方向上的唯一性:A-B或B-A添加到容器中

时间:2012-06-21 07:48:06

标签: c# .net unique tuples

我正在使用HashSet<T>构建图表并验证要添加的顶点的唯一性。如果尚未添加项目,则其方法Add()将返回true。

边缘可以使用哪种技术?我需要验证对A-B或对B-A对是否加了一次。

这是我正在使用的数据的轻量级版本:

interface INode
{
    INode[] Previous { get; }

    Node Next { get; }
}

然后我有:

INode current;
INode[] allPrevious = ExternalMethod1(current);
INode[] allNext = ExternalMethod2(current);

因此我无法在递归循环时构建图形,我将所有数据存储起来以进行迭代。

1 个答案:

答案 0 :(得分:2)

为边创建自己的相等比较器实现,并将HashSet<T>.Comparer设置为它的实例。例如:

class Edge
{
    public string From { get; set; }
    public string To { get; set; }
}

class EdgeEqualityComparer : IEqualityComparer<Edge>
{
    public bool Equals(Edge lhs, Edge rhs)
    {
        return (lhs.From.Equals(rhs.From) && lhs.To.Equals(rhs.To)) ||
               (lhs.From.Equals(rhs.To) && lhs.To.Equals(rhs.From));
    }

    public int GetHashCode(Edge e)
    {
        return e.From.GetHashCode() ^ e.To.GetHashCode();
    }
}

当然,您还必须检查无效。所有standard caveats也适用于GetHashCode实施。