Vérification de l’égalité des listes dans C # .Net ne fonctionne pas avec Nhibernate

StackOverflow https://stackoverflow.com/questions/1401554

  •  05-07-2019
  •  | 
  •  

Question

Je semble avoir un problème avec la vérification de l’égalité des listes. Dans mon cas, j'ai deux objets de rôle et je veux voir s'ils sont égaux. Chaque rôle contient un nom et une liste d'autorisations. Chaque autorisation ne contient qu'un nom.

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; }
}

J'ai défini une méthode equals sur les objets Role et Permission. Ces objets sont chargés depuis la base de données à l’aide de Nhibernate. Cela signifie que le rôle contient en réalité toutes les autorisations d'un objet de type NHibernate.Collection.PersistentBag qui implémente l'interface IList.

Dans la méthode equals de la classe de rôle, la condition suivante est remplie:

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

Cela retourne toujours faux. Même lorsque les autorisations de la liste contiennent des objets portant des noms identiques dans un ordre identique. Cela aurait du sens si je n'avais pas implémenté la méthode equals pour l'objet Permission, mais c'est ce que je fais

Lorsque j'exécute une instruction comme celle-ci:

role1.equals(role2);

Ce qui se passe, c'est qu'il passe d'abord à la méthode equals de l'objet Role. Bien. La méthode equals vérifie le nom du rôle pour voir s'ils sont égaux. Elles sont. Puis vérifie si les autorisations sont égales en utilisant le code donné ci-dessus.

J'ai un point d'arrêt dans la méthode equals de la classe Permission ainsi que dans la méthode GetHashCode. Lorsque cette instruction est exécutée, ni la méthode equals ni la méthode GetHashCode de la classe d'autorisation ne sont appelées, mais cette dernière retourne toujours la valeur false. En fait, je ne vois pas ce qui se passe pour déterminer que les deux listes ne sont pas égales. Qu'est-ce qui est exécuté? Je ne peux même pas entrer dans cette ligne de code.

Cela semble fonctionner, mais cela ne fonctionne pas. Quelqu'un a des idées sur ce qui se passe?

Était-ce utile?

La solution

Lorsque vous comparez deux listes, la méthode Equals NE compare PAS les éléments de cette liste. Il comparera l’objet List avec l’autre objet List.

Une liste est un objet qui a sa propre "identité".

Ceci, par exemple, ne retournera jamais vrai:

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));

La méthode Equals ne compare pas le contenu de la liste, mais la liste elle-même. Si vous voulez ce comportement, je pense que vous devrez implémenter votre propre type de liste.

Autres conseils

Comme Fredrik l'a dit, est égal à ne compare pas le contenu des listes. Mais Enumerable.SequenceEqual le fait. Vérifier

scroll top