【问题标题】:Checking of List equality in C# .Net not working when using Nhibernate使用 Nhibernate 时检查 C# .Net 中的列表相等性不起作用
【发布时间】:2009-09-09 19:21:29
【问题描述】:

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

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;

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

当我执行这样的语句时:

role1.equals(role2);

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

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

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

【问题讨论】:

    标签: c# .net nhibernate ilist


    【解决方案1】:

    正如 Fredrik 所说,Equals 不会比较列表的内容。但是Enumerable.SequenceEqual 可以。 查看 Is there a built-in method to compare collections in C#? 了解更多信息。

    【讨论】:

      【解决方案2】:

      当您将 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 类型。

      【讨论】:

      • 但这仅仅意味着没有使用 IList.Equals(obj1, obj2) 方法。这个方法和 obj1==obj2 一样!如果它没有提供额外的好处,为什么还要在 IList 接口上定义这个方法?我错过的两者之间有区别吗?
      • IList 接口没有定义 Equals 方法。然而,List 类确实有一个 Equals 方法,但是,这是因为 .NET 中的每个类都继承自“Object”,而 Equals 方法是在“Object”类中定义的。见:msdn.microsoft.com/en-us/library/system.object.aspx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2015-05-05
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多