使用Nhibernate时,检查C#.Net中的列表相等性是否正常

16 .net c# nhibernate ilist

我似乎遇到了检查列表相等性的问题.在我的情况下,我有两个角色对象,我想看看它们是否相等.每个角色都包含一个名称和一个权限列表.每个权限只包含一个名称.

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

if (!IList.Equals(Permissions, otherObj.Permissions)) return false;
Run Code Online (Sandbox Code Playgroud)

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

当我执行这样的语句时:

role1.equals(role2);
Run Code Online (Sandbox Code Playgroud)

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

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

这似乎应该有效,但事实并非如此.有什么想法发生了什么?

Pio*_*pla 49

正如Fredrik所说Equals,不比较列表的内容.但是Enumerable.SequenceEqual.检查 是否有内置方法来比较C#中的集合?了解更多信息.


Fre*_*els 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));
Run Code Online (Sandbox Code Playgroud)

Equals方法不会比较列表的内容,而是列表本身.如果你想要这种行为,我认为你必须实现自己的List类型.

  • IList接口未定义Equals方法.但是,List类确实有一个Equals方法,但这是因为.NET中的每个类都继承自'Object',而Equals方法是在'Object'类中定义的.请参阅:http://msdn.microsoft.com/en-us/library/system.object.aspx (5认同)