我想知道如何改变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);
}
}
答案 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
,然后在需要时进行排序。即使性能很重要,您仍可能希望进行比较,看看这是否更好。