IComparable
한 방향으로 만 작동
Employee
수업 이 있다고 가정 해 봅시다 . Employees
한보기에서 이름별로 정렬하고 다른 주소별로 정렬 하여 표시하려고 합니다. 어떻게 달성 할 수 있습니까? 하지와 IComparable
적어도되지 않은 관용적 인 방법.
IComparable
논리가 잘못된 곳에있다
인터페이스는를 호출하여 사용됩니다 .Sort()
. Customer
이름별로 정렬 된 보기에는 정렬 방법을 암시하는 코드가 전혀 없습니다.
반면에 Customer
클래스는 사용 방법을 가정하고 있습니다.이 경우 이름별로 정렬 된 목록에서 사용됩니다.
IComparable
암시 적으로 사용됩니다
대안과 비교할 때 비교 논리가 어디에 사용되는지 또는 전혀 사용하지 않는 것은 매우 어렵습니다. 표준 IDE를 가정하고 Customer
클래스 에서 시작한다고 가정하면
- 에 대한 모든 참조 검색
Customer
- 목록에 사용 된 참조를 찾으십시오.
- 그 목록이
.Sort()
그들에게 전화 한 적이 있는지 확인하십시오
더 나쁜 IComparable
것은 여전히 사용중인 구현을 제거하면 오류나 경고가 표시되지 않습니다. 당신이 얻을 수있는 유일한 것은 당신이 생각하기에 너무 모호한 모든 장소에서 잘못된 행동입니다.
이러한 문제와 요구 사항 변경
내가 이것에 대해 생각하게 된 이유는 그것이 나에게 잘못 되었기 때문입니다. 나는 IComparable
2 년 동안 내 응용 프로그램에서 행복하게 사용 하고 있습니다. 이제 요구 사항이 변경되었으며 사물을 두 가지 방식으로 정렬해야합니다. 이전 섹션에서 설명한 단계를 수행하는 것은 재미없는 일입니다.
질문
이 문제 는 대안으로 더 잘 제공되지 않는 유효한 유스 케이스를 보지 못하기 때문에 또는 IComparable
보다 열등하다고 생각 합니다. 항상 사용 하거나 LINQ 를 사용하는 것이 좋습니까 , 아니면 여기에 표시되지 않는 장점 / 사용 사례가 있습니까?IComparer
.OrderBy()
IComparer
IComparable
더 이상 사용 하지 않을 것이므로 내 요점이 강화됩니다.
SortedXXX
컬렉션을, 그들 중 하나로 저장된 요소를 필요로 IComparable
하거나이 가지고 IComparer
제공. 또한 하나의 비교기로 자연 정렬 순서를 바꾸고 모든 IComparable
객체에서 작동하도록하는 것은 사소한 일입니다 .
IComparable
간주됩니다 . 기본 비교 메커니즘을 재정의하려는 경우에 사용됩니다. IComparer
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634