2009-09-09 6 views
16

リストの等価性のチェックに問題があるようです。私の場合、2つのロールオブジェクトがあり、それらが等しいかどうかを確認したいのです。各ロールには、名前と権限のリストが含まれています。各パーミッションには名前だけが含まれています。C#でのリストの等価性のチェックNhibernateを使用しているときに.Netが動作しない

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型のオブジェクトにすべてのアクセス許可が実際に含まれています。

if (!IList.Equals(Permissions, otherObj.Permissions)) return false; 

これは常にfalseを返している次のように私は条件を持っている役割クラスのequalsメソッドで

。リスト内のパーミッションに同じ名前のオブジェクトが同じ順序で含まれている場合でも。これは、Permissionオブジェクトに対してequalsメソッドを実装していないと意味がありますが、私は持っています。

私はこのような文を実行します。

role1.equals(role2); 

何が起こるかというと、それは最初のRoleオブジェクトのequalsメソッドに行くということです。良い。 equalsメソッドは、ロールの名前が等しいかどうかをチェックします。彼らです。次に、上記のコードを使用して権限が等しいかどうかを確認します。

私は、PermissionクラスのequalsメソッドとGetHashCodeメソッドにブレークポイントを持っています。そのステートメントが実行されると、権限クラスのequalsメソッドもGetHashCodeメソッドも呼び出されませんが、常にfalseが返されます。実際には、2つのリストが等しくないと判断するために何が起こるか把握することはできません。何が実行されますか?私はそのコード行に入ることさえできません。

これはうまくいくはずですが、そうではありません。誰でも何が起こっているかについてのアイデアはありますか?

答えて

12

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メソッドは、リストの内容を比較しますが、リスト自体はありません。 この動作が必要な場合は、独自のタイプのリストを実装する必要があると思います。

+1

しかし、これは単純にIList.Equals(obj1、obj2)メソッドを使用していないことを意味します。このメソッドは、obj1 == obj2!と同じです。追加のメリットがない場合でもIListインターフェイスでこのメソッドを定義するのはなぜですか?私が紛失している2つの違いはありますか? –

+5

IListインターフェイスでは、Equalsメソッドが定義されていません。 しかし、ListクラスにはEqualsメソッドがありますが、これは.NETのすべてのクラスが 'Object'から継承し、Equalsメソッドが 'Object'クラスで定義されているためです。 参照:http://msdn.microsoft.com/en-us/library/system.object.aspx –

関連する問題