我似乎在检查列表相等性时遇到了问题。在我的例子中,我有两个角色对象,我想看看它们是否相等。每个角色都包含一个名称和一个权限列表。每个权限只包含一个名称。
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;
这总是返回false。即使列表中的权限以相同的顺序包含具有相同名称的对象。如果我没有为Permission对象实现equals方法,这将是有意义的,但我已经实现了。
当我执行这样的语句时:
role1.equals(role2);
发生的事情是,它首先转到Role对象的equals方法。好的。equals方法检查角色的名称以查看它们是否相等。他们是。然后使用上面给出的代码检查权限是否相等。
我在Permission类的equals方法和GetHashCode方法中有一个断点。执行该语句时,permission类上的equals方法和GetHashCode方法都不会被调用,但始终返回false。事实上,我不知道会发生什么来确定这两个列表是不相等的。执行的是什么?我甚至不能进入这行代码。
这看起来应该行得通,但事实并非如此。有人知道这是怎么回事吗?
发布于 2009-09-09 19:30:29
当您将两个列表相互比较时,Equals方法不会比较该列表中的项。它会将该列表对象与另一个列表对象进行比较。
列表是一个对象,它有自己的“身份”。
例如,这将永远不会返回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方法不比较列表的内容,而是比较列表本身。如果你想要这个行为,我认为你必须实现你自己类型的列表。
发布于 2009-09-09 19:57:59
正如Fredrik所说,Equals
不会比较列表的内容。但是Enumerable.SequenceEqual
有。有关更多信息,请查看Is there a built-in method to compare collections in C#?。
https://stackoverflow.com/questions/1401554
复制相似问题