2017-06-29 69 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