Verifica dell'uguaglianza dell'elenco in C # .Net non funzionante quando si utilizza Nhibernate

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

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top