2017-06-29 73 views
1

我试图抓取具有相同列表的相同类型的两个HashSets之间的公共值,但我在IntersectWith命令后返回了0个值。我使用相同的列表作为故障排除测试开始,但最终returnlist的值将随着int y遍历序列而改变。HashSet <T> .IntersectWith()返回0结果

调试显示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; 
    } 
} 
+0

向我们展示'CfgPerson'的实现。 – apocalypse

+0

对不起,我不确定你要求的具体内容。我怎么能为你获取这些信息? CfgPerson对象是我使用的SDK的一部分。 – Jon

回答

1

因为你没有自己CfgPerson类,你无法实现Equals方法你应该告诉HashSet如何确定该类型的平等。您可以使用以IEqualityComparer<T>作为参数的构造函数创建HashSet

所以:

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>

+0

感谢你们这样做,我最终为CfgPerson构建了一个自定义的IEqualityComparer,它完美的工作! – Jon