C# SortedSet元素相等性

3

我想知道如何更改SortedSet确定两个对象是否相等的方式。

我有一个SortedSet<Tuple<Edge, int>>(new Helpers.EdgeDistanceComparer()),比较器方法是:

public class EdgeDistanceComparer : IComparer<Tuple<Edge,int>>
{
    public int Compare(Tuple<Edge, int> x, Tuple<Edge, int> y)
    {
        return Comparer.Default.Compare(x.Item2, y.Item2);
    }
}

我认为这是因为Sorted Set只比较整数(Tuple.Item2),如何在Edge类上进行比较?

编辑

为了更好地解释问题:

我想通过Edge类比较项目,并按Tuple.Item2对它们进行排序,如果两个Tuple.Item2相等,则无论如何都要将该项目添加到SortedSet中。

第二次编辑

Ben给出了一个很好的答案,但最终我决定向我的类添加一个属性,以便我保存在Tuple.Item2中的值现在保存在我的Edge类的属性中。然后,我实现了IComparable接口,这是我的Edge类的样子:

public class Edge : IComparable
{
    public Coordinate Coordinates { get; set; }
    public string Value { get; set; }
    public Edge Parent { get; set; }
    public int Cost { get; set; }


    public int CompareTo(object obj)
    {
        var thatEdge = (Edge) obj;
        if (Cost > thatEdge.Cost)
        {
            return 1;
        }
        if (Cost < thatEdge.Cost)
        {
            return -1;
        }
        // cost may be same but coordinates must be different
        if (Cost == thatEdge.Cost &&
            (Coordinates.X != thatEdge.Coordinates.X || Coordinates.Y != thatEdge.Coordinates.Y))
        {
            return -1;
        }
        return 0;
    }
}

SortedSet的IComparer:

   public class EdgeDistanceComparer : IComparer<Edge>
    {
        public int Compare(Edge x, Edge y)
        {
            return Comparer.Default.Compare(x, y);
        }

    }

2
让我确认一下我理解你的意思:你想要使用元组的第二个项目进行排序,但使用元组的第一个项目进行相等比较? - Ben Aaronson
是的,那正是我想要的。 - hyperN
1
如果您有两个具有不同“Edges”但相同“int”的元组,您希望它们都出现在集合中吗? - Ben Aaronson
是的,那就是我想要的 :) - hyperN
1个回答

3

我认为这个答案对另一个问题的回答包含了你想要的最接近的东西。

在这种情况下,TValue 是你的 Tuple<Edge,int>,所以在构造函数中传入的 IComparer 与你帖子中的相同。

唯一的其他添加是,使它像一个 Set 一样运作,就是在 Add 方法中添加一个检查,只有在集合中没有已经包含具有相同 Edge 的项目时才将其添加到集合中。一种方法是:

public void Add(TValue item) 
{
    if(!_Container.Select(p => p.Value).Contains(item, _equalityComparer) 
        _Container.Add(Indexed.Create(_Index++, item)); 
}

其中_equalityComparer是一个返回边相等的IEqualityComparer<Tuple<Edge,int>>

很遗憾,这有点混乱,我认为它可能会失去许多你可能从SortedSet中想要的性能优势,但这可能是你能得到的最好结果,因为在System.Collections中没有针对此类问题的解决方案。如果性能不重要,您可以尝试使用Set或甚至List,并在需要时进行排序。即使性能很重要,您仍然可能希望进行比较,并查看这是否更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接