在使用Nhibernate时C#.Net中列表相等的检查不起作用怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

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

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从数据库加载。这意味着角色实际上包含实现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。事实上,我无法弄清楚为了确定这两个列表不同而发生了什么。什么得到执行?我甚至无法进入该行代码。

这似乎应该工作,但它不会。任何人有什么想法是怎么回事?

提问于
用户回答回答于

当您将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

扫码关注云+社区