16

我似乎在检查列表是否相等时遇到了问题。就我而言,我有两个角色对象,我想看看它们是否相等。每个角色都包含一个名称和一个权限列表。每个权限只包含一个名称。

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

我在 Role 和 Permission 对象上定义了一个 equals 方法。这些对象是使用 Nhibernate 从数据库中加载的。这意味着 Role 实际上包含实现 IList 接口的 NHibernate.Collection.PersistentBag 类型对象中的所有权限。

在 Role 类的 equals 方法中,我有一个条件如下:

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

这总是返回错误。即使列表中的权限包含具有相同名称且顺序相同的对象。如果我没有为 Permission 对象实现 equals 方法,这将是有意义的,但我有。

当我执行这样的语句时:

role1.equals(role2);

发生的情况是它首先进入 Role 对象的 equals 方法。好的。equals 方法检查角色的名称以查看它们是否相等。他们是。然后使用上面给出的代码检查权限是否相等。

我在 Permission 类的 equals 方法和 GetHashCode 方法中有一个断点。执行该语句时,不会调用权限类上的 equals 方法和 GetHashCode 方法,但它始终返回 false。实际上,我无法弄清楚会发生什么以确定两个列表不相等。什么被执行?我什至无法进入那行代码。

这似乎应该工作,但它没有。有人对发生的事情有任何想法吗?

4

2 回答 2

49

正如弗雷德里克所说Equals,不比较列表的内容。但Enumerable.SequenceEqual确实如此。检查 是否有内置方法来比较 C# 中的集合?了解更多信息。

于 2009-09-09T19:57:58.747 回答
12

当您将 2 个列表相互比较时,Equals 方法不会比较该列表中的项目。它将 List 对象与另一个 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 类型。

于 2009-09-09T19:30:28.843 回答