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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top