2012-05-21 2 views
3

나는 이런 식으로 구축 메타 모델을 가지고있는 사용자 정의 개체와 목록을 비교. 요소의 ID를 비교하고 싶습니다. 모든 요소 유형에 대한 메서드를 작성하고 싶지는 않습니다.는 공통의 슈퍼 클래스

Package a; //pretend both have classes 
Package b; //and nested packages 
compare(a.nestedPackages, b.nestedPackages); 
compare(a.ownedClasses; b.OwnedClasses); 

클래스 및 패키지는 모두 ModelElement에서 상속되므로 둘 모두 ID를가집니다. 그래서 ID를 비교하는 "비교"함수를 작성하고 싶습니다. 제네릭 사용을 생각했지만 일반적인 데이터 유형에는 "id"속성이 없습니다. 어떤 아이디어? Linq에의 Except 사용자 지정 비교 자와 같은

답변

4

사용자 정의 비교 자와 결합하여 Enumerable.SequenceEqual을 볼 수 있습니다. 여기

bool equal = Enumerable.SequenceEqual(a.nestedPackages, b.nestedPackages, 
    new ModelElementComparer()); 

public class ModelElementComparer : IEqualityComparer<ModelElement> 
{ 
    public bool Equals(ModelElement x, ModelElement y) 
    { 
     return x.id == y.id; 
    } 

    public int GetHashCode(ModelElement obj) 
    { 
     return x.id; 
    } 
} 

this particular SequenceEqual overrideIEqualityComparer interface에 대한 MSDN의 링크입니다. 이 작업을 수행 할 경우

+0

나를 위해, 지금은 이유를 이해하기 위해 설명서를 읽어야 만합니다.) – twittfort

+0

설명서에 대한 MSDN 링크가 포함되도록 편집되었습니다. :) –

1

는 대신 비교 방법을 작성, 당신은뿐만 아니라 ModelElement 클래스

public override bool Equals(Object obj) 
{ 
    //Check for null and compare run-time types. 
    if (obj == null || GetType() != obj.GetType()) 
     return false; 
    ModelElement m = (ModelElement)obj; 
    return (id == m.id); 
} 

또한 Object.GetHashCode를 오버라이드 (override) 할 필요가 있습니다()에서() 메소드 Object.Equals를 오버라이드 (override) 할 수있다.

+0

문제는 Metamodel이 제공되고 수정이 허용되지 않는다는 것입니다. 그렇지 않으면 좋은 해결책입니다. 고맙습니다. – twittfort

+0

수정 : * 그렇지 않습니다. – twittfort

관련 문제