我想知道如何更改 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。
编辑 2
Ben 给出了很好的答案,但最后我决定在我的类中再添加一个属性,这样我保存在 Tuple.Item2 中的值现在保存在我的 Edge 类的属性中。然后我实现了 IComparable 接口(interface),所以这是我的 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);
}
}
最佳答案
我相信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>>
如果边相等,则返回 true。
不幸的是,这有点困惑,我认为它可能会失去很多您可能希望从 SortedSet
获得的性能优势。 , 但它可能是你能得到的最好的,因为 System.Collections
中没有任何内容。面向这个。如果性能不重要,您可以尝试 Set
甚至 List
,并在需要时进行排序。即使性能很重要,您可能仍想进行比较,看看这是否更好。
关于C# SortedSet 元素相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790046/