gpt4 book ai didi

C# SortedSet 元素相等

转载 作者:行者123 更新时间:2023-11-30 16:12:33 30 4
gpt4 key购买 nike

我想知道如何更改 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com