Verifica dell'uguaglianza dell'elenco in C # .Net non funzionante quando si utilizza Nhibernate
-
05-07-2019 - |
Domanda
Sembra che si sia verificato un problema con il controllo dell'uguaglianza dell'elenco. Nel mio caso, ho due oggetti ruolo e voglio vedere se sono uguali. Ogni ruolo contiene un nome e un elenco di autorizzazioni. Ogni permesso contiene solo un nome.
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 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 uguale della classe Role ho una condizione come segue:
if (!IList.Equals(Permissions, otherObj.Permissions)) return false;
Questo restituisce sempre false. Anche quando le autorizzazioni nell'elenco contengono oggetti con nomi identici in ordine identico. Ciò avrebbe senso se non avessi implementato un metodo uguale per l'oggetto Permission, ma l'ho fatto.
Quando eseguo una dichiarazione come questa:
role1.equals(role2);
Quello che succede è che per prima cosa si passa al metodo uguale a Oggetto ruolo. Buono. 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 indicato sopra.
Ho un punto di interruzione nel metodo equals della classe Permission e nel metodo GetHashCode. Quando viene eseguita tale istruzione, non viene chiamato né il metodo uguale né il metodo GetHashCode sulla classe di autorizzazione ma restituisce sempre false. In effetti, non riesco a capire cosa succede per determinare che le due liste non sono uguali. Cosa viene eseguito? Non posso nemmeno entrare in quella riga di codice.
Sembra che dovrebbe funzionare ma non funziona. Qualcuno ha qualche idea su cosa sta succedendo?
Soluzione
Quando si confrontano 2 elenchi tra loro, il metodo Equals NON confronta gli elementi presenti in tale elenco. Confronterà l'oggetto Elenco con l'altro oggetto Elenco.
Una lista è un oggetto, che ha la sua 'identità'.
Questo ad esempio, non restituirà mai true:
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 confronta i contenuti dell'elenco, ma l'elenco stesso. Se vuoi questo comportamento, penso che dovrai implementare il tuo tipo di Elenco.
Altri suggerimenti
Come ha detto Fredrik Equals
non confronta il contenuto delle liste. Ma Enumerable.SequenceEqual
lo fa.
Dai un'occhiata
Esiste un metodo integrato per confrontare le raccolte in C #? per maggiori informazioni.