Frage

Ich scheine ein Problem mit der Überprüfung für die Liste Gleichheit zu haben. In meinem Fall habe ich zwei Rollenobjekte und ich möchte sehen, ob sie gleich sind. Jede Rolle enthält einen Namen und eine Liste der Berechtigungen. Jede Berechtigung enthält nur einen Namen.

public class Role : BaseDomain
{
        virtual public String Name { get; set; }
        virtual public IList Permissions { get; set; }
}

public class Permission
{
        virtual public String Name { get; set; }
}

I definiert ein Gleichheits Verfahren sowohl von der Rolle und die Berechtigungsobjekte. Diese Aufgaben werden aus der Datenbank geladen Nhibernate verwenden. Dies bedeutet, dass die Rolle, die die Zugriffsrechte alle tatsächlich enthält in einem Objekt vom Typ, der den NHibernate.Collection.PersistentBag IList Schnittstelle implementiert.

In der Methode equals der Rollenklasse Ich habe eine Bedingung wie folgt:

if (!IList.Equals(Permissions, otherObj.Permissions)) return false;

Dies ist immer false zurückgibt. Selbst wenn die Berechtigungen in der Liste enthalten Objekte mit identischen Namen in gleicher Reihenfolge. Dies würde Sinn machen, wenn ich nicht umgesetzt hatte eine Gleichheits Methode für das Permission-Objekt, aber ich habe.

Wenn ich ausführen, um eine Anweisung wie folgt:

role1.equals(role2);

Was passiert, ist, dass es geht zunächst auf die Rolle des Objekts Methode entspricht. Gut. Die equals Methode überprüft den Namen der Rolle zu sehen, ob sie gleich sind. Sie sind. Dann wird geprüft, ob die Berechtigungen equals sind mit dem Code oben.

Ich habe einen Haltepunkt in der Methode equals der Permission-Klasse sowie die GetHashCode-Methode. Wenn diese Anweisung ausgeführt wird, weder die Methode equals noch die GetHashCode-Methode für die Berechtigungsklasse aufgerufen wird, aber es gibt immer false zurück. In der Tat kann ich nicht herausfinden gesehen, was in Ordnung, dass die beiden Listen nicht gleich sind, um zu bestimmen geschieht. Was wird ausgeführt? Ich kann nicht einmal in diese Codezeile Schritt.

Dies scheint, wie es funktionieren soll, aber es funktioniert nicht. Wer irgendwelche Ideen auf, was los ist?

War es hilfreich?

Lösung

Wenn Sie zwei Listen miteinander vergleichen zu können, wird die Equals-Methode nicht die Einzelteile vergleichen, die in dieser Liste enthalten sind. Es wird das List-Objekt mit dem anderen List-Objekt vergleichen.

Eine Liste ist ein Objekt, das seine eigene ‚Identität‘ hat.

Dies zum Beispiel, wird nie wieder zurückkehrt wahr:

List<int> firstList = new List<int>();
List<int> secondList = new List<int>();

firstList.Add(1);
firstList.Add(2);

secondList.Add(1);
secondList.Add(2);


Assert.IsTrue (firstList.Equals(secondList));

Die Equals-Methode nicht den Inhalt der Liste vergleichen, aber die Liste selbst. Wenn Sie dieses Verhalten wollen, glaube ich, dass Sie zu werden Ihre eigene Art von Liste implementieren.

Andere Tipps

Wie Fredrik sagte Equals nicht den Inhalt der Listen nicht zu vergleichen. Aber Enumerable.SequenceEqual tut. Prüfen Gibt es eine integrierte Methode Sammlungen vergleichen in C #? für weitere Informationen.

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