Schneiden mit einer benutzerdefinierten IEqualityComparer mit Linq
Lange Geschichte kurz: ich habe 2 collections von Objekten. Eine enthält gute Werte (nennen wir es mal "Gute"), die andere default-Werte (Mr. "Default"). Ich möchte die Schnittmenge der Union zwischen Gut und Standard, und Standard. In anderen Worten: Intersect(Union(Fein, Standard), Standard). Man könnte denken, es löst als Standard, aber hier ist, wo es kompliziert : ich benutze eine benutzerdefinierte IEqualityComparer.
Habe ich die folgenden Klassen :
class MyClass
{
public string MyString1;
public string MyString2;
public string MyString3;
}
class MyEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass item1, MyClass item2)
{
if(item1 == null && item2 == null)
return true;
else if((item1 != null && item2 == null) ||
(item1 == null && item2 != null))
return false;
return item1.MyString1.Equals(item2.MyString1) &&
item1.MyString2.Equals(item2.MyString2);
}
public int GetHashCode(MyClass item)
{
return new { item.MyString1, item.MyString2 }.GetHashCode();
}
}
Hier sind die Merkmale meiner Kollektionen Gut und Standard-Kollektionen :
Standard : Es ist ein großes set, mit allen wollte { MyString1, MyString2 } - Paaren, aber die MyString3 Werte sind, wie Sie sich vorstellen können, werden default-Werte.
Gut : Es ist eine kleinere Gruppe, die hauptsächlich Elemente, die in der Standard-set, aber mit einigen guten MyString3 Werte. Es hat auch einige { MyString1, MyString2 }, die außerhalb der gesuchten gesetzt.
Was ich tun möchte, ist diese : Nehmen Sie nur die Elemente aus dem Guten, sind in Standard -, aber fügen Sie die anderen Elemente in Verzug.
Hier ist, was ich denke, ist, mein bestes versuchen :
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
Ich gelehrt, es sollte gearbeitet haben, aber das Ergebnis bekomme ich im Grunde nur das gute { MyString1, MyString2 } - Paaren festgelegt, aber alle aus dem Standard-set, so habe ich den default-Wert alle über. Ich habe auch versucht, die Umschaltung des Standard-und des Guten in der letzten Überschneiden, aber ich bekomme das gleiche Ergebnis.
InformationsquelleAutor der Frage Tipx | 2010-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst ist es falsch:
Wenn die hashcode ' s Verschieden sind Sie sicher, dass die entsprechenden 2 Elemente unterschiedlich sind, aber wenn Sie gleich ist nicht garantiert, dass die entsprechenden 2 Elemente gleich sind.
So ist dies die richtige
Equals
Umsetzung:Als Hosen vorgeschlagen (Antizipation mir) der code ist der folgende:
InformationsquelleAutor der Antwort digEmAll
Müssen Sie prüfen, für tatsächliche Gleichstellung, nicht nur Gleichheit hashcode.
GetHashCode()
ist nicht (und kann nicht) Kollision frei, das ist der Grund, warum dieEquals
- Methode erforderlich ist, in den ersten Platz.Können, können Sie auch dies tun, viel mehr einfach durch schreiben
Den
Distinct
Methode wird wieder das erste Element von jedem paar von Duplikaten, so wird das Ergebnis das gewünschte Ergebnis.BEARBEITEN: Das sollte
InformationsquelleAutor der Antwort SLaks