2009-09-09 26 views
16

Parece que tengo un problema para verificar la igualdad de la 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.Comprobación de la igualdad de la lista en C# .Net no funciona cuando se utiliza Nhibernate

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

He definido un método igual en los objetos Role y Permission. Estos objetos se cargan desde la base de datos usando Nhibernate. Esto significa que la función 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 papel que tienen una condición de la siguiente manera:

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

Esto siempre vuelve falsa. Incluso cuando los permisos en la lista contienen objetos con nombres idénticos en el mismo orden. Esto tendría sentido si no hubiera implementado un método equals para el objeto Permiso, pero tengo.

Cuando ejecuta una instrucción como esta:

role1.equals(role2); 

Lo que sucede es que primero va a la del objeto de función es igual método. 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 indicado anteriormente.

Tengo un punto de interrupción en el método equals de la clase Permiso, así como el método GetHashCode. Cuando se ejecuta esa instrucción, no se llama ni al método igual ni al método GetHashCode en la clase de permiso, pero siempre devuelve falso. 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.

Parece que debería funcionar, pero no es así. ¿Alguien tiene alguna idea de lo que está pasando?

Respuesta

12

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

Una lista es un objeto, que tiene su propia "identidad".

Esto por ejemplo, nunca volverá cierto:

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 es igual a no comparar el contenido de la lista, pero la propia lista. Si desea este comportamiento, creo que deberá implementar su propio tipo de lista.

+1

Pero eso simplemente significa que no hay uso del método IList.Equals (obj1, obj2). Este método hace lo mismo que obj1 == obj2! ¿Por qué incluso se ha definido este método en la interfaz IList si no proporciona beneficios adicionales? ¿Hay alguna diferencia entre los dos que me estoy perdiendo? –

+5

La interfaz IList no define un método Equals. Sin embargo, la clase List tiene un método Equals, pero esto se debe a que cada clase en .NET hereda de 'Object' y el método Equals se define en la clase 'Object'. Ver: http://msdn.microsoft.com/en-us/library/system.object.aspx –

Cuestiones relacionadas