我似乎在检查列表相等性时遇到了问题。在我的例子中,我有两个角色对象,我想看看它们是否相等。每个角色都包含一个名称和一个权限列表。每个权限仅包含一个名称。
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 接口(interface)的 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。事实上,我看不出为了确定两个列表不相等会发生什么。什么被执行?我什至无法进入那行代码。
这看起来应该有效,但实际上没有。有人对发生的事情有任何想法吗?
最佳答案
正如 Fredrik 所说,Equals
不比较列表的内容。但是 Enumerable.SequenceEqual
可以。
查看
Is there a built-in method to compare collections in C#?了解更多信息。
关于c# - 使用 Nhibernate 时,检查 C# .Net 中的列表相等性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401554/