Verificação da Lista igualdade em C # .Net não funciona ao usar Nhibernate
-
05-07-2019 - |
Pergunta
Parece que estou tendo um problema com a verificação de lista igualdade. No meu caso, eu tenho dois objetos papel e eu quero ver se eles são iguais. Cada papel contém um nome e uma lista de permissões. Cada permissão contém apenas um 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; }
}
I definido um método em ambos o papel e os objetos de permissão iguais. Estes objectos são carregados a partir da base de dados usando Nhibernate. Isto significa que o papel efectivamente contém todas as permissões de um objecto do tipo NHibernate.Collection.PersistentBag que implementa a interface IList.
No método da classe Role eu tenho uma condição igual a seguinte:
if (!IList.Equals(Permissions, otherObj.Permissions)) return false;
Este é sempre retornar false. Mesmo quando as permissões na lista contêm objetos com nomes idênticos em ordem idêntica. Isso faria sentido se eu não tivesse implementado um método é igual para o objeto de permissão, mas eu tenho.
Quando eu executar uma instrução como esta:
role1.equals(role2);
O que acontece é que ele primeiro vai para o método equals do objeto função. Boa. O método Equals verifica o nome da função para ver se eles são iguais. Eles são. Em seguida, verifica se as permissões são iguais, usando o código dado acima.
Eu tenho um ponto de interrupção no método da classe Permission, bem como o método GetHashCode iguais. Quando essa instrução é executada, nem o método equals nem o método GetHashCode na classe de permissão é chamado, mas ele sempre retorna falso. Na verdade, eu não posso visto para descobrir o que acontece, a fim de determinar que as duas listas não são iguais. O que é executado? Eu não posso nem entrar nesse linha de código.
Isto parece que deve funcionar, mas isso não acontece. Alguém tem alguma idéia sobre o que está acontecendo?
Solução
Quando você compara 2 listas uns com os outros, o método Equals NÃO irá comparar os itens que estão nessa lista. Ele irá comparar o objeto de lista com o outro objeto List.
A lista é um objeto, que tem a sua própria 'identidade'.
Este por exemplo, nunca vai retornar 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));
O método Equals não se compara o conteúdo da lista, mas a própria lista. Se você quiser esse comportamento, eu acho que você vai ter que implementar seu próprio tipo de lista.
Outras dicas
Como Fredrik disse Equals
não comparar o conteúdo das listas. Mas Enumerable.SequenceEqual
faz.
Verifica
Existe um built-in método para comparar coleções em C #? para mais informações.