Проверка равенства List в С#.Net не работает при использовании Nhibernate
Кажется, у меня проблема с проверкой равенства списка. В моем случае у меня есть два объекта роли, и я хочу посмотреть, равны ли они. Каждая роль содержит имя и список разрешений. Каждое разрешение содержит только имя.
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);
Что происходит, так это то, что он сначала переходит к методу equals Role. Хорошо. Метод equals проверяет имя роли, чтобы узнать, равны ли они. Они есть. Затем проверяет, равны ли Разрешения, используя приведенный выше код.
У меня есть точка останова в методе equals класса Permission, а также метод GetHashCode. Когда этот оператор выполняется, не вызывается ни метод equals, ни метод GetHashCode в классе разрешений, но он всегда возвращает false. На самом деле я не могу понять, что происходит, чтобы определить, что эти два списка не равны. Что выполняется? Я даже не могу войти в эту строку кода.
Кажется, что он должен работать, но это не так. У кого-нибудь есть идеи о том, что происходит?
Ответы
Ответ 1
Когда вы сравниваете 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.
Ответ 2
Как сказал Фредрик, Equals
не сравнивает содержимое списков. Но Enumerable.SequenceEqual
делает.
Проверьте
Есть ли встроенный метод сравнения коллекций в С#? для получения дополнительной информации.