2017-06-29 1 views
1

Ich versuche, gemeinsame Werte zwischen zwei HashSets des gleichen Typs mit identischen Listen zu greifen, aber ich bekomme 0 Werte nach dem IntersectWith Befehl zurückgegeben. Ich benutze die gleiche Liste als einen Fehlerbehebungs-Test, aber der Wert von returnlist wird sich ändern, wenn Sie die Sequenz durchlaufen.HashSet <T> .IntersectWith() gibt 0 zurück

Debugging zeigt, dass comparelist.IntersectWith(returnlist);comparelist zu 0 Elementen ändert. Nur zur Klarstellung, returnlist und comparelist enthalten die gleichen Elemente in der gleichen Reihenfolge.

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

Zeigen Sie uns 'CfgPerson' Implementierung. – apocalypse

+0

Sorry, ich bin mir nicht sicher, wonach genau du fragst. Wie kann ich diese Informationen für Sie erhalten? Das CfgPerson-Objekt ist Teil eines SDK, das ich verwende. – Jon

Antwort

1

Da Sie nicht besitzen CfgPerson Klasse und Sie können nicht Equals Methode implementieren Sie HashSet sagen sollte, wie für diese Art Gleichheit zu bestimmen. Sie können HashSet mit Konstruktor erstellen, der IEqualityComparer<T> als Parameter verwendet.

So:

1) erstellen Klasse CfgPersonEqualityComparer : IEqualityComparer<CfgPerson> (müssen Dokumentation lesen, wie es zu tun)
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) (es automatisch erkennt dass beide HashSets die gleichen Gleichheitsvergleiche verwenden)

Oder erstellen Sie einfach Wrapper um CfgPerson, dieimplementiert, Equals und IEquatable<CfgPerson>.

+0

Danke dafür, ich habe am Ende einen benutzerdefinierten IEqualityComparer für CfgPerson gebaut und es hat perfekt funktioniert! – Jon

Verwandte Themen