form - listas en c#
La verificación de la igualdad de lista en C#.Net no funciona cuando se usa Nhibernate (2)
Como dijo Fredrik, Equals
no compara el contenido de las listas. Pero Enumerable.SequenceEqual
hace. Verificar ¿Existe un método incorporado para comparar colecciones en C #? para más información.
Parece que tengo un problema 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 Rol y Permiso. 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 está volviendo 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 sí lo hice.
Cuando ejecuto una declaración como esta:
role1.equals(role2);
Lo que sucede es que primero va al método de iguales 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 que se indica arriba.
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 sobre qué está pasando?
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 los contenidos de la lista, sino la lista en sí. Si desea este comportamiento, creo que tendrá que implementar su propio tipo de lista.