2009-09-09 2 views
16

목록 평등을 확인하는 데 문제가있는 것 같습니다. 제 경우에는 두 개의 역할 객체가 있고 그것들이 동등한지를보고 싶습니다. 각 역할에는 이름과 사용 권한 목록이 있습니다. 각 권한에는 이름 만 들어 있습니다.Nhibernate를 사용할 때 C# .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 유형의 개체에 모든 사용 권한을 포함합니다. 이것은 항상 false를 반환

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

다음과 같이 역할 클래스의 equals 메소드에서

나는 조건이있다. 목록의 사용 권한에 동일한 이름의 개체가 동일한 순서로 포함되어있는 경우에도 마찬가지입니다. Permission 객체에 대해 equals 메서드를 구현하지 않은 경우이 방법이 유용 할 수 있습니다.

나는이 같은 문을 실행할 때 :

role1.equals(role2); 

무엇 발생하는 것은 처음 역할 오브젝트의 equals 메소드로 이동한다는 것입니다. 좋은. equals 메서드는 롤의 이름이 같은지 확인합니다. 그들은. 그런 다음 위에 주어진 코드를 사용하여 권한이 동일한 지 확인하십시오.

나는 GetHashCode 메서드뿐만 아니라 Permission 클래스의 equals 메서드에 중단 점이 있습니다. 해당 문을 실행하면 권한 클래스의 equals 메서드 나 GetHashCode 메서드가 호출되지 않지만 항상 false를 반환합니다. 사실 두 목록이 동등하지 않다고 판단하기 위해 어떤 일이 발생하는지 파악할 수 없습니다. 무엇이 실행됩니까? 나는 그 코드 줄을 밟을조차 수 없다.

작동하는 것처럼 보이지만 그렇지 않습니다. 누구든지 무슨 일이 벌어지고 있는지에 대한 아이디어가 있습니까?

답변

12

두 목록을 서로 비교할 때 Equals 메서드는 해당 목록에있는 항목을 비교하지 않습니다. List 개체와 다른 List 개체를 비교합니다.

목록은 고유 한 'ID'를 가진 개체입니다.

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)); 

(가) 목록의 내용을 비교하지 않는 방법 같음하지만 목록 자체 :

예를 들어

이, true를 반환하지 않습니다. 이 동작을 원하면 독자적인 List 유형을 구현해야한다고 생각합니다.

+1

그러나 이는 단순히 IList.Equals (obj1, obj2) 메서드를 사용하지 않는다는 것을 의미합니다. 이 메소드는 obj1 == obj2!와 같습니다. 추가 이점이없는 IList 인터페이스에서이 메서드를 정의하는 이유는 무엇입니까? 내가 잃어버린 두 가지의 차이점이 있습니까? –

+5

IList 인터페이스는 Equals 메서드를 정의하지 않습니다. 그러나 List 클래스에는 Equals 메서드가 있지만 .NET의 모든 클래스는 'Object'에서 상속되고 Equals 메서드는 'Object'클래스에서 정의되므로이 클래스가 같습니다. 참조 : http://msdn.microsoft.com/en-us/library/system.object.aspx –