Frage

Um diese Frage nicht zu sehr zu wiederholen, aber ich habe bereits eine Suche durchgeführt und bin bei einem Ergebnis leer gekommen. Ich habe also zwei Entitätskollektionen vom Typ t und möchte die gemeinsamen Elemente in jedem finden. Der Fang? Alle Felder außer einem müssen übereinstimmen. Wenn zum Beispiel Typ T ein Typ -CustomSet ist und das CustomSet Felder F1, F2, F3 und ein FK -Feld Andere, F1, F2 und F3 enthält (sie könnten Saiten, INTs, alles wirklich alles sein) und die andere ID niemals werden werden passen. Meine aktuelle Implementierung:

var intersections = source.Intersect(destination).ToList();

Wird niemals Ergebnisse liefern, da diese andere ID -Spalte niemals in einer anderen Sammlung übereinstimmt, obwohl die Felder F1, F2 und F3 möglicherweise übereinstimmen. Ich schlage also eine benutzerdefinierte Implementierung von iEqualityComparer vor, die so aussieht:

var intersections = source.Intersect(destination, new EntityCollectionComparer<T>()).ToList();

public class EntityCollectionComparer<T> : IEqualityComparer<T>
{
    #region IEqualityComparer<T> Members

    public bool Equals(T x, T y)
    {
        if (x.Equals(y))
            return true;
        else
            return false;
    }

    public int GetHashCode(T obj)
    {
        if (obj is CustomSet)
        {
            CustomSet temp = obj as CustomSet;

            return (temp.F1.GetHashCode() ^ temp.F2.GetHashCode() ^ temp.F3.GetHashCode());
        }
        return obj.GetHashCode();
    }

Jetzt teste ich dies nur, damit das OBJ, das in das Geben von Anpassungen übergeben wird, vom Typ Annäherung ist. Ich werde die erforderlichen Anweisungen für meine anderen Typen hinzufügen, wenn ich dies ordnungsgemäß funktionieren kann. Ich weiß, dass die Schnittweiterung den Gethashcode anstelle der Gleichen verwendet, um Elemente zu vergleichen, weshalb es mir wirklich egal ist, was in meinem Gleichen ist, da diese Klasse niemals aufgerufen wird, sondern für die Schnittstelle bei EntityCollections. Die Sache ist, das funktioniert nicht. Bei meinem Testsatz weiß ich, dass ich 28 Elemente in meiner 'Quell' -Sammlung und 28 Elemente in meiner 'Ziel'sammlung habe und alle Felder übereinstimmen (offensichtlich mit Ausnahme des anderen ID). Ich trat den Gethashcode -Code durch, als er 56 -mal geschleudert hatte und konnte Hash -Codes für alle 28 Elemente aus jedem Satz übereinstimmen, aber die "Kreuzungen" ergaben 0 Zählungen. Gibt es etwas, das ich falsch mache oder fehlt? Vielen Dank. }

War es hilfreich?

Lösung

Das ist Dein Problem:

Ich weiß, dass die Schnittweiterung den Gethashcode anstelle der Gleichen verwendet, um Elemente zu vergleichen, weshalb es mir wirklich egal ist, was in meinem Gleichen ist, da diese Klasse niemals aufgerufen wird, sondern für die Schnittstelle bei EntityCollections.

Das ist einfach nicht wahr. GetHashCode wird als erste "schnelle" Art der Eimerwerte verwendet, aber Equals Wird immer noch nach Artikeln mit demselben Hash gerufen, sonst können Sie nicht wissen, dass sie gleich sind.

So funktionieren Hash -Tabellen usw. immer: Die Hashes sollten für ungleiche Werte unterschiedlich sein, wenn es aus Leistungsgründen machbar ist, aber sind, sind aber erlaubt kollidieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top