문제

목록 평등을 확인하는 데 문제가있는 것 같습니다. 제 경우에는 두 가지 역할 객체가 있으며 동일인지 확인하고 싶습니다. 각 역할에는 이름과 권한 목록이 포함됩니다. 각 권한에는 이름 만 포함됩니다.

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

역할과 권한 객체 모두에 대한 평등 메소드를 정의했습니다. 이 객체는 nhibernate를 사용하여 데이터베이스에서로드됩니다. 이는 역할에 실제로 ILIST 인터페이스를 구현하는 nhibernate.collection.persistentbag의 객체의 모든 권한이 포함되어 있음을 의미합니다.

역할 클래스의 동등한 방법에서 I에는 다음과 같이 조건이 있습니다.

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

이것은 항상 거짓을 반환합니다. 목록의 권한에 동일한 순서로 동일한 이름을 가진 개체가 포함 된 경우에도. 권한 오브젝트에 대한 동등한 방법을 구현하지 않았지만 이에도 적합합니다.

다음과 같은 진술을 실행할 때 :

role1.equals(role2);

일어나는 일은 먼저 역할 Object의 평등 방법으로 이동하는 것입니다. 좋은. Equals 메소드는 역할의 이름을 확인하여 동등한 지 확인합니다. 그들은. 그런 다음 권한이 위에 주어진 코드를 사용하는지 여부를 확인하십시오.

허가 클래스의 동등한 방법과 gethashcode 메소드에 중단 점이 있습니다. 해당 명령문이 실행되면 권한 클래스의 평등 메소드 나 gethashcode 메소드가 호출되지 않지만 항상 False를 반환합니다. 사실, 나는 두 목록이 동일하지 않다는 것을 결정하기 위해 어떤 일이 일어나는지 알아낼 수 없습니다. 무엇이 실행됩니까? 나는 그 코드 라인에 들어갈 수 없다.

이것은 작동해야하지만 그렇지 않습니다. 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

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

목록은 자체 '신원'을 가진 객체입니다.

예를 들어 이것은 결코 진실을 반환하지 않을 것입니다.

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 메소드는 목록의 내용을 비교하지 않고 목록 자체를 비교합니다. 이 동작을 원한다면 자체 유형의 목록을 구현해야한다고 생각합니다.

다른 팁

프레드릭이 말했듯이 Equals 목록의 내용을 비교하지 않습니다. 하지만 Enumerable.SequenceEqual 하다. 확인하다C#의 컬렉션을 비교하는 내장 방법이 있습니까? 더 많은 정보를 위해서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top