我有一个 HashSet<MyCustomClass> mySet = new HashSet<MyCustomClass>();,我希望删除所有包含相同值的 MyCustomClass。

假设 MyCustomClass 看起来像这样:

public class MyCustomClass
{
    Point point;

    public MyCustomClass(int x, int y)
    {
        point.X = x;
        point.Y = y;
    }

    // Other methods...
}

我试图像 MSDN 建议的那样实现 IEqualityComparer,并通过 HashSet<MyCustomClass>(); 的构造函数传递它,但我最终没有成功。

正确的做法是什么?

编辑:

这是我的 Chain 类和我的 ChainEqualityComparer :
public class Chain
{
    HashSet<Mark> chain;
    HashSet<Mark> marks;

    public Chain(HashSet<Mark> marks)
    {
        chain = new HashSet<Mark>();
        this.marks = marks;
    }
    // Other methods...
}

public class ChainEqualityComparer : IEqualityComparer<Chain>
{
    #region IEqualityComparer<Chain> Members

    public bool Equals(Chain x, Chain y)
    {
        if (x.ChainWithMarks.Count == y.ChainWithMarks.Count)
        {
            foreach (Mark mark in x.ChainWithMarks)
            {
                if (!y.ChainWithMarks.Contains(mark))
                    return false;
            }
            return true;
        }

        return false;
    }

    public int GetHashCode(Chain obj)
    {
        return obj.GetHashCode() ^ obj.GetType().GetHashCode();
    }

    #endregion
}

这是我的 Mark 类:
  public class Mark
{
    int x;
    int y;

    public Mark(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int X
    {
        get { return x; }
        set { x = value; }
    }

    public int Y
    {
        get { return y; }
        set { y = value; }
    }
}

public class MarkEqualityComparer : IEqualityComparer<Mark>
{
    #region IEqualityComparer<Mark> Members

    public bool Equals(Mark x, Mark y)
    {
        return (x.X == y.X) && (x.Y == y.Y);
    }

    public int GetHashCode(Mark obj)
    {
        return obj.GetHashCode() ^ obj.GetType().GetHashCode();
    }

    #endregion
}

(如果代码太多,我可以粘贴代码...)

最佳答案

您可以使用 EqualityComparer 或仅覆盖 Equals 和 GetHashCode。

您必须确保将您认为是重复的任何内容标识为具有等效的哈希码,并在测试相等性时返回 true。

我的猜测是你没有返回相等的哈希码。你能从你的平等比较器中发布代码吗?

作为测试,您可以执行以下操作:

var set = new HashSet<MyCustomClass>();
var a = new MyCustomClass(1,2);
var b = new MyCustomClass(1,2);
set.Add(a);
set.Add(b);
Assert.IsTrue(a.Equals(b));
Assert.IsTrue(b.Equals(a));
Assert.AreEqual(a.GetHashCode(), b.GetHashCode());
Assert.AreEqual(1, set.Count);

一组类似的测试也适用于相等比较器。

编辑

是的,怀疑是哈希码函数。您需要根据类型本身的值来计算它。一个足够常见的错误。
public int GetHashCode(Mark obj)
{
    return ((MyCustomClass)obj).point.GetHashCode();
}

假设 point 是您类型中唯一的状态字段。

关于c# - 如何使用 HashSet<MyCustomClass> 删除 MyCustomClass 的重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3080322/

10-11 05:25