我试图在具有相同列表的相同类型的两个HashSets
之间获取公共值,但是在IntersectWith
命令之后返回0值。我使用相同的列表作为故障排除测试开始,但最终returnlist
的值将随着迭代遍历序列而改变。
调试显示comparelist.IntersectWith(returnlist);
将comparelist
更改为0项。只是为了澄清,returnlist
和comparelist
包含相同顺序的相同项目。
CfgPersonQuery firstquery = new CfgPersonQuery();
firstquery.Filter.Add("skill_dbid", skills.First());
comparelist = new HashSet<CfgPerson>(confService.RetrieveMultipleObjects<CfgPerson>(firstquery));
foreach (int y in skills.Skip(1))
{
try
{
CfgPersonQuery query = new CfgPersonQuery();
query.Filter.Add("skill_dbid", skills.First());
HashSet<CfgPerson> returnlist = new HashSet<CfgPerson>(
confService.RetrieveMultipleObjects<CfgPerson>(query));
comparelist.IntersectWith(returnlist);
}
catch
{
return null;
}
}
答案 0 :(得分:1)
由于您没有CfgPerson
类,并且无法实现Equals
方法,因此您应该告诉HashSet
如何确定该类型的相等性。您可以使用以HashSet
作为参数的构造函数创建IEqualityComparer<T>
。
所以:
1)创建课程CfgPersonEqualityComparer : IEqualityComparer<CfgPerson>
(需要阅读文档如何操作)
2)var comparer = new CfgPersonEqualityComparer()
3)var hashSet1 = new HashSet(collection1, comparer)
4)var hashSet2 = new HashSet(collection2, comparer)
5)var result = hashSet1.IntersectWith(hashSet2)
(它将自动检测两个HashSets使用相同的相等比较器)
或者只是创建CfgPerson
周围的包装器,它实现GetHasCode
,Equals
和IEquatable<CfgPerson>
。