2010-12-30 2 views
2

나는 내 응용 프로그램에 여러 개의 클래스가 있는데, 모두 Name 속성을 가지고 있습니다 (Distinct() 등). 나는 항상 Name을 비교할 것이므로, 다른 모든 클래스가 구현하는 Name이라는 속성을 가진 인터페이스 인 ISomeComparedStuff을 추출하기로 결정했습니다. 나는 같은 비교 클래스를 설정 :Linq 하나의 비교 클래스 (및 인터페이스)로 구분

public class SomeStuff : ISomeComparedStuff 
{ 
    ... 
} 

public class SomeMoreStuff : ISomeComparedStuff 
{ 
    ... 
} 

var someStuff = GetSomeStuff().Distinct(new MyComparer); 
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer); 

내가 캐스트 오류 (ISomeComparedStuff-SomeStuff)를 얻고있다 : 나는 그것에 대하여 코드하려고 할 때

public class MyComparer : IEqualityComparer<ISomeComparedStuff> 
{ 
    public bool Equals(ISomeComparedStuff x, ISomeComparedStuff y) 
    { 
      return x.Name == y.Name; 
    } 

    public int GetHashCode(ISomeComparedStuff obj) 
    { 
      return obj.Name.GetHashCode(); 
    } 
} 

유일한 문제입니다. 이 방법을 사용하면 하나의 클래스 만 비교하면됩니다. 그렇지 않으면 항상 모든 클래스에 대해 하나씩 작성해야합니다 (비록 항상 Name과 비교할지라도).

참고 :이 질문에 "제목"에 도움이 필요하다는 점을 이해합니다. 어떤 제안이라도 좋을 것입니다.

답변

2

이것이 좋은 해결책인지 확실하지 않지만 MyComparer를 제네릭 클래스로 만드는 방법에 대해 알고 싶습니다.

public static IEnumerable<T> DistinctByName<T>(this IEnumerable<T> values) 
    where T: ISomeComparedStuff 
{ 
    return values.Distinct(new MyComparer<T>()); 
} 
0

아마 같은 :

var someStuff = GetSomeStuff().Cast<ISomeComparedStuff>().Distinct(new MyComparer); 

또는 제네릭이 아닌 IEqualityComparer를 사용합니다.

+0

나는이 방법을 좋아한다 :

var someStuff = GetSomeStuff().Distinct(new MyComparer<SomeStuff>()); var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer<SomeMoreStuff>()); 

조금 확장, 당신은이 같은 새로운 확장 방법을 만들 수 :

public class MyComparer<T> : IEqualityComparer<T> where T: ISomeComparedStuff { public bool Equals(T x, T y) { return x.Name == y.Name; } public int GetHashCode(T obj) { return obj.Name.GetHashCode(); } } 

단점은 당신이 새에 적절한 버전입니다 (특히 DistinctByName()과 같은 다른 확장 메서드로 캡슐화 된 경우), 그러나 요소를 다시 원래 형식으로 캐스팅해야합니다. 그렇지 않으면 결과로 생성되는 IEnumerable 는 아마도 쓸모가 없습니다. –

+0

예. 나는 캐스트 후에 모든 데이터를 잃을 것이라고 염려 할 것입니다. –

+0

데이터가 손실되지 않습니다. 인터페이스로의 캐스트는 손실이 없습니다. –

관련 문제