Nhibernateを使用している場合、C#.Netでのリストの等価性のチェックが機能しない
-
05-07-2019 - |
質問
リストの等価性のチェックに問題があるようです。私の場合、2つの役割オブジェクトがあり、それらが等しいかどうかを見たいです。各ロールには、名前と権限のリストが含まれています。各許可には名前のみが含まれます。
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メソッドにブレークポイントがあります。そのステートメントが実行されると、パーミッションクラスのequalsメソッドもGetHashCodeメソッドも呼び出されませんが、常にfalseを返します。実際、2つのリストが等しくないことを判断するために何が起こるかを理解することはできません。何が実行されますか?そのコード行に足を踏み入れることさえできません。
これは動作するはずですが、動作しないようです。誰が何が起こっているのかについてのアイデアを持っていますか?
解決
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メソッドは、リストの内容ではなく、リスト自体を比較します。 この動作が必要な場合は、独自のタイプのリストを実装する必要があると思います。
他のヒント
Fredrikが言ったように、 Equals
はリストの内容を比較しません。しかし、 Enumerable.SequenceEqual
はそうです。
チェック
コレクションを比較するための組み込みメソッドはありますかC#の場合詳細については。