- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
我有一个 HashSet mySet = new HashSet();我希望删除所有包含相同值的 MyCustomClass。 假设 MyCustomClass 看起来像这样: public clas
这是一个错误: Could not cast value of type MyApp.Member (0x1674daf8) to MyAppTests.Member (0x4c07248). 您可以
如何扩展(或重载)包含集合中某些自定义属性的方法? 我希望该委托(delegate)将对象与其属性进行比较,如果存在具有相同属性值的对象则返回 true。 最佳答案 return myCollecti
我有一个在 ArrayAdapter 中用于 ListView 的 ArrayList。我需要获取列表中的项目并将它们转换为 JSONArray 以发送到 API。我四处搜索,但没有找到任何解释这可能
我是 Objective-C 和 cocoa 的新手,正在尝试创建一个基于文档的应用程序,用于在文件系统中保存和加载自定义类。我的符合nscoding协议(protocol)的自定义类如下: NSSt
我有一个名为 DatePicker 的自定义类,它扩展了 DialogFragment 并实现了 DatePickerDialog.OnDateSetListener,但我的问题是因为您需要监听onD
问题: 我有一个类Foo包含 IDictionary> .我正在使用自定义 ContractResolver如图this answer这样我的字典将序列化为包含“Key”和“Value”属性的对象数组
我试图初始化一个通用集合列表,像这样: List myCustomClassList = new List() {myCustomClassInstance1, myCustomClassInstan
现在我需要我的 Controller 根据业务逻辑返回 2 种不同类型的对象,所以我的问题是我应该使用 ResponseEntity 或者我应该使用: ResponseEntity 这种返回类型有
我是一名优秀的程序员,十分优秀!