HashSet <t> .IntersectWith()返回0结果

时间:2017-06-29 17:09:04

标签: c# hashset

我试图在具有相同列表的相同类型的两个HashSets之间获取公共值,但是在IntersectWith命令之后返回0值。我使用相同的列表作为故障排除测试开始,但最终returnlist的值将随着迭代遍历序列而改变。

调试显示comparelist.IntersectWith(returnlist);comparelist更改为0项。只是为了澄清,returnlistcomparelist包含相同顺序的相同项目。

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;
    }
}

1 个答案:

答案 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周围的包装器,它实现GetHasCodeEqualsIEquatable<CfgPerson>