Проверка равенства списка в C # .Net не работает при использовании Nhibernate

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Кажется, у меня возникла проблема с проверкой равенства списков. В моем случае у меня есть два ролевых объекта, и я хочу посмотреть, равны ли они. Каждая роль содержит имя и список разрешений. Каждое разрешение содержит только имя.

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

Я определил метод equals для объектов Role и Permission. Эти объекты загружаются из базы данных с использованием Nhibernate. Это означает, что роль фактически содержит все разрешения в объекте типа NHibernate.Collection.PersistentBag, который реализует интерфейс IList.

В методе equals класса Role у меня есть условие:

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

Это всегда возвращает false. Даже если разрешения в списке содержат объекты с одинаковыми именами в одинаковом порядке. Это имело бы смысл, если бы я не реализовал метод equals для объекта Permission, но у меня есть.

Когда я выполняю инструкцию вроде этого:

role1.equals(role2);

Что происходит, так это то, что он сначала обращается к методу equal объекта Role. Хорошо. Метод equals проверяет имя роли, чтобы увидеть, равны ли они. Они есть. Затем проверяет, равны ли разрешения, используя приведенный выше код.

У меня есть точка останова в методе equals класса Permission, а также в методе GetHashCode. Когда этот оператор выполняется, ни метод equals, ни метод GetHashCode в классе разрешений не вызываются, но он всегда возвращает false. На самом деле, я не вижу, чтобы выяснить, что происходит, чтобы определить, что два списка не равны. Что исполняется? Я даже не могу войти в эту строку кода.

Кажется, это должно работать, но это не так. У кого-нибудь есть идеи о том, что происходит?

Это было полезно?

Решение

Когда вы сравниваете 2 списка друг с другом, метод Equals НЕ сравнивает элементы, которые находятся в этом списке. Он сравнит объект List с другим объектом List.

Список - это объект, который имеет свою собственную «идентичность».

Это, например, никогда не вернет 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));

Метод Equals сравнивает не содержимое списка, а сам список. Если вам нужно такое поведение, я думаю, вам придется реализовать собственный тип List.

Другие советы

Как сказал Фредрик, Equals не сравнивает содержимое списков. Но Enumerable.SequenceEqual делает. Проверьте Существует ли встроенный метод для сравнения коллекций в C #? для получения дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top