C#SortedSet元素相等

时间:2014-04-01 15:18:29

标签: c# c#-4.0

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

我有SortedSet<Tuple<Edge, int>>(new Helpers.EdgeDistanceComparer()),而Comparer方法是:

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集只比较整数(Tuple.Item2),我怎样才能在Edge类上进行比较

修改

更多地解释问题:

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

编辑2

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);
        }

    }

1 个答案:

答案 0 :(得分:3)

我相信this answer另一个问题包含了你最接近你想要的东西

在这种情况下,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,如果边缘相等则返回true。

遗憾的是,这有点混乱,我认为它可能会从System.Collections中失去很多性能优势,但它可能是你能得到的最好的,因为{{1}中没有任何内容。 1}}面向这个。如果性能不重要,您可以尝试Set甚至List,然后在需要时进行排序。即使性能很重要,您仍可能希望进行比较,看看这是否更好。