C# SortedSet 元素相等

标签 c# c#-4.0

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

相关文章:

c# - DataGrid PreviewTextInput 事件从输入中删除控制字符

c# - 如何在 C# 中屏蔽/隐藏电子邮件地址

c# - 放一个类名=命名空间,在使用

c# - 如何防止 SaveFileDialog 提示两次以替换/覆盖文件?

c# - 迭代/加法 MD5

java - 为什么学习基类能力不好

c# - PointerMoved 事件未触发

c# - 使用请求 header 对 BasicHttpBinding 进行身份验证

c# - 获取媒体文件持续时间的最快方法是什么?

c#-4.0 - 如何使用具有 IEnumerable<T> 类型属性的 UIHint 创建 EditorTemplate