La comprobación de la igualdad de listas en C # .Net no funciona cuando se usa Nhibernate

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Parece que estoy teniendo problemas con la verificación de la igualdad de lista. En mi caso, tengo dos objetos de rol y quiero ver si son iguales. Cada rol contiene un nombre y una Lista de permisos. Cada permiso contiene solo un nombre.

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

Definí un método igual en los objetos Role y Permission. Estos objetos se cargan desde la base de datos utilizando Nhibernate. Esto significa que el Rol realmente contiene todos los Permisos en un objeto de tipo NHibernate.Collection.PersistentBag que implementa la interfaz IList.

En el método equals de la clase Role, tengo una condición como la siguiente:

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

Esto siempre devuelve falso. Incluso cuando los Permisos en la lista contienen objetos con nombres idénticos en orden idéntico. Esto tendría sentido si no hubiera implementado un método igual para el objeto Permiso, pero lo he hecho.

Cuando ejecuto una declaración como esta:

role1.equals(role2);

Lo que sucede es que primero va al método igual del objeto Role. Bueno. El método equals verifica el nombre del rol para ver si son iguales. Son. Luego verifica si los Permisos son iguales usando el código dado anteriormente.

Tengo un punto de interrupción en el método equals de la clase de permiso, así como el método GetHashCode. Cuando se ejecuta esa instrucción, no se llama al método equals ni al método GetHashCode en la clase de permiso, pero siempre devuelve false. De hecho, no puedo ver qué sucede para determinar que las dos listas no son iguales. ¿Qué se ejecuta? Ni siquiera puedo entrar en esa línea de código.

Esto parece que debería funcionar pero no funciona. Alguien tiene alguna idea de lo que está pasando?

¿Fue útil?

Solución

Cuando compara 2 listas entre sí, el método Equals NO comparará los elementos que están en esa lista. Comparará el objeto Lista con el otro objeto Lista.

Una Lista es un objeto, que tiene su propia 'identidad'.

Esto, por ejemplo, nunca devolverá verdadero:

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

El método Equals no compara el contenido de la lista, sino la lista misma. Si desea este comportamiento, creo que tendrá que implementar su propio tipo de Lista.

Otros consejos

Como dijo Fredrik Equals no compara el contenido de las listas. Pero Enumerable.SequenceEqual sí. Comprobar ¿Existe un método incorporado para comparar colecciones? en C #? para más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top