2009-09-09 5 views
16

Sembra che si stia verificando un problema con il controllo dell'uguaglianza delle liste. Nel mio caso, ho due oggetti ruolo e voglio vedere se sono uguali. Ogni ruolo contiene un nome e un elenco di autorizzazioni. Ogni autorizzazione contiene solo un nome.Controllo dell'uguaglianza dell'elenco in C# .Net non funziona quando si utilizza Nhibere

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

Ho definito un metodo di uguale su entrambi gli oggetti Ruolo e Autorizzazione. Questi oggetti vengono caricati dal database utilizzando Nhibernate. Ciò significa che il ruolo contiene effettivamente tutte le autorizzazioni in un oggetto di tipo NHibernate.Collection.PersistentBag che implementa l'interfaccia IList.

Nel metodo equals della classe ruolo che hanno una condizione come segue:

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

Questo è sempre tornando falsa. Anche quando le autorizzazioni nell'elenco contengono oggetti con nomi identici nello stesso ordine. Questo avrebbe senso se non avessi implementato un metodo di uguale per l'oggetto Permission, ma l'ho fatto.

Quando eseguo una dichiarazione come questa:

role1.equals(role2); 

Quello che succede è che va prima al ruolo dell'oggetto è uguale metodo. Buona. Il metodo equals controlla il nome del ruolo per vedere se sono uguali. Loro sono. Quindi controlla se le autorizzazioni sono uguali utilizzando il codice riportato sopra.

Ho un punto di interruzione nel metodo equals della classe Permission e del metodo GetHashCode. Quando viene eseguita questa istruzione, non viene chiamato né il metodo equals né il metodo GetHashCode sulla classe di autorizzazione, ma restituisce sempre false. In realtà, non riesco a capire cosa succede per determinare che le due liste non sono uguali. Cosa viene eseguito? Non riesco nemmeno ad entrare in quella linea di codice.

Sembra che dovrebbe funzionare ma non è così. Qualcuno ha qualche idea su cosa sta succedendo?

risposta

12

Quando si confrontano 2 elenchi l'uno con l'altro, il metodo Equals NON confronta gli elementi presenti in tale elenco. Confronta l'oggetto Elenco con l'altro oggetto Elenco.

Un elenco è un oggetto, che ha la sua 'identità'.

Questo, per esempio, non tornerà mai più vero:

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

Il metodo Equals non confrontare il contenuto della lista, ma la lista stessa. Se vuoi questo comportamento, penso che dovrai implementare il tuo tipo di Lista.

+1

Ma ciò significa semplicemente che non è possibile utilizzare il metodo IList.Equals (obj1, obj2). Questo metodo fa lo stesso di obj1 == obj2! Perché anche questo metodo è definito sull'interfaccia IList se non fornisce ulteriori vantaggi? C'è una differenza tra i due che mi manca? –

+5

L'interfaccia IList non definisce un metodo Equals. La classe List ha tuttavia un metodo Equals, ma questo perché ogni classe in .NET eredita da "Object" e il metodo Equals è definito nella classe "Object". Vedere: http://msdn.microsoft.com/en-us/library/system.object.aspx –

Problemi correlati