Frage

Bezogen auf die Frage, die ich zuvor gestellt habe:Vergleichen Sie zwei Listen, die viele Objekte enthalten

Es ist beeindruckend zu sehen, wie schnell dieser Vergleich durch die Implementierung der IEqualityComparer-Schnittstelle durchgeführt wird: Beispiel hier

Wie ich in meiner anderen Frage erwähnt habe, hilft mir dieser Vergleich dabei, einen Quellordner in einem Zielordner zu sichern.Da ich weiß, dass ich mit Ordnern synchronisieren möchte, muss ich die Daten der Dateien vergleichen.Immer wenn ich etwas mache wie:

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            s.dateModified.Date <= d.dateModified.Date;  // This line does not work. 
            // I also tried comparing the strings by converting it to a string and it does
            // not work. It does not give me an error but it does not seem to include the files
            // where s.dateModified.Date < d.dateModified.Date

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (a.compareName.GetHashCode() * 251 + a.size.GetHashCode() * 251 + a.deepness.GetHashCode() + a.dateModified.Date.GetHashCode());

        return rt;

    }
}

Es wäre schön, wenn ich etwas Ähnliches mit Größer-/Gleich-als-Zeichen machen könnte.Ich habe auch versucht, die tick-Eigenschaft zu verwenden, aber es funktioniert nicht.Vielleicht mache ich etwas falsch.Ich glaube, es ist nicht möglich, Dinge mit dem Kleiner-Gleichheitszeichen zu vergleichen, das diese Schnittstelle implementiert.Außerdem verstehe ich nicht, wie diese Klasse funktioniert;Ich weiß nur, dass es beeindruckend ist, wie schnell die gesamte Liste durchlaufen wird.

War es hilfreich?

Lösung

Da sich die Datentime-Objekte unterscheiden, wenn eine DateTime weniger als der andere ist, erhalten Sie unterschiedliche Hashcodes für die Objekte S und d und das gleiche Verfahren istnicht angerufen.Um Ihren Vergleich der Datumsangaben zu arbeiten, sollten Sie den Datumsteil aus der GetHashCode-Methode entfernen: generasacodicetagpre.

Andere Tipps

Ihr gesamter Ansatz ist grundlegend fehlerhaft, weil Ihr IEqualityComparer.Equals Methode ist nicht symmetrisch.Das heisst Equals(file1, file2) ist nicht gleich Equals(file2, file1) aufgrund der Art und Weise, wie Sie den Kleiner-als-Operator verwenden.

Die Dokumentation:

heißt es eindeutig:

Hinweise für Implementierer

Die Equals-Methode ist reflexiv, symmetrisch und transitiv.Das heißt, es gibt „true“ zurück, wenn es zum Vergleichen eines Objekts mit sich selbst verwendet wird.wahr für zwei Objekte x und y, wenn es für y und x wahr ist;und wahr für zwei Objekte x und z, wenn es für x und y wahr ist und auch für y und z wahr ist.

Implementierungen sind erforderlich, um sicherzustellen, dass, wenn die Equals-Methode für zwei Objekte x und y „true“ zurückgibt, der von der GetHashCode-Methode für x zurückgegebene Wert dem für y zurückgegebenen Wert entsprechen muss.

Stattdessen müssen Sie die verwenden IComparable Schnittstelle bzw IEqualityComparer in Kombination mit Datumsvergleichen.Wenn Sie dies nicht tun, scheint es für eine Weile zu funktionieren, aber Sie werden es später bereuen.

Ihr GetHashCode hat ein Problem: generasacodicetagpre.

Ich habe das Datums-Teil gewechselt, da ich auch die Zeit brauchte, daher verwende ich stattdessen die Ticks-Eigenschaft.Ich habe den datenhemedifizierten Hashed-Code losgelassen und es funktioniert gut.So hat ich mein Programm geändert.Ich hatte Probleme mit dem Vergleich der Termine, daher habe ich das Ticks-Eigentum verwendet. generasacodicetagpre.

Ich weiß immer noch nicht, wie diese Hash-Code-Funktion funktioniert.Das Schöne ist, dass es großartig funktioniert.

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