나는 내 응용 프로그램에 여러 개의 클래스가 있는데, 모두 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
과 비교할지라도).
참고 :이 질문에 "제목"에 도움이 필요하다는 점을 이해합니다. 어떤 제안이라도 좋을 것입니다.
나는이 방법을 좋아한다 :
조금 확장, 당신은이 같은 새로운 확장 방법을 만들 수 :
단점은 당신이 새에 적절한 버전입니다 (특히 DistinctByName()과 같은 다른 확장 메서드로 캡슐화 된 경우), 그러나 요소를 다시 원래 형식으로 캐스팅해야합니다. 그렇지 않으면 결과로 생성되는 IEnumerable는 아마도 쓸모가 없습니다. –
예. 나는 캐스트 후에 모든 데이터를 잃을 것이라고 염려 할 것입니다. –
데이터가 손실되지 않습니다. 인터페이스로의 캐스트는 손실이 없습니다. –