gpt4 book ai didi

c# - 如何使用 HashSet 删除 MyCustomClass 的重复项?

转载 作者:太空狗 更新时间:2023-10-30 00:46:32 25 4
gpt4 key购买 nike

我有一个 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...
}

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

什么是正确的做法?

编辑:

这是我的 Chain类(class)和我的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/

25 4 0