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