HashSets的自定义比较

问题描述 投票:1回答:1

我正在尝试为我的班级创建一个自定义比较器:

using System.Collections.Generic;

namespace i.changed.namespaces.DataStructures
{
public class Edge
{
    public Cords startPoint, endPont;
    public double length;

    //more code here that doesnt matter
}

public class EdgeComparer : IEqualityComparer<Edge>
{
    public bool Equals(Edge x, Edge y)
    {
        //Check whether the objects are the same object. 
        if (x.Equals(y)) return true;

        return x.startPoint.Equals(y.startPoint) && x.endPont.Equals(y.endPont) && (x.length - y.length < 0.0001);

    }

    public int GetHashCode(Edge obj)
    {
        int hash = 17;
        hash = hash * 23 + obj.length.GetHashCode();
        hash = hash * 23 + obj.startPoint.GetHashCode();
        hash = hash *23 + obj.endPont.GetHashCode();

        return hash;
    }
}

}

我在另一个对象中使用这个类:

using i.changed.namespaces.DataStructures;
namespace i.changed.namespaces
public class MyClass
{
   HashSet<Edge> Edges, NewEdges;
   public MyClass()
   {
      NewEdges = new HashSet<Edge>();
      Edges = new HashSet<Edge>();
   }

在某些时候我想得到这个hashsets的联合:

newEdges.UnionWith(Edges);

但看起来它从未以这种方式使用我的EdgeComparer。我究竟做错了什么?

c# union hashset
1个回答
3
投票

HashSet<T>提供构造函数,您可以在其中传递IEquilityComparer<T>的自定义实现。如果你通过它,那么它将被使用,否则HashSet<T>将使用默认的IEquilityComparer<T>构建。

您的问题的解决方案是稍微修改您的代码并将您的EdgeComparer传递给HasSet<Edge>构造函数

public MyClass()
{
    NewEdges = new HashSet<Edge>(new EdgeComparer());
    Edges = new HashSet<Edge>(new EdgeComparer());
}
© www.soinside.com 2019 - 2024. All rights reserved.