2011-08-26 3 views
0

나는 정렬해야합니다 List(Of MyObject) 있습니다. 따라서 IComparable, IEquatable, IEqualityComparerIComparer을 구현하고 정렬이 올바르게 작동하도록했습니다.오버로드 List.Sort

프로젝트에 대한 새로운 요구 사항이 새로 추가되었습니다. 정렬 된 목록에는 'duplicate'객체를 포함 할 수 없습니다. 이 경우 중복은 정렬 목적으로 중복이 정의 된 방법과 약간 다릅니다. 두 객체를 검사하고 선호 객체를 반환하는 새 루틴을 만들었습니다. 선호하는 값은 하나를 제외하고는 모든 값이 동일하고 마지막 값이 가장 큰 값입니다. 나는이 일과를 잘하고있다. 이제

나는 List으로 IComparable 인터페이스를 사용하여 정렬 한 후 것 일반적으로 일종의 자체 첫 번째 '중복'을 제거하기 위해 Sort 메서드를 재정의 한 후 IList(Of MyObject)을 상속 객체를 생성하고하여 '제거 중복'문제를 해결하기 위해 사랑 것 . 그러나, 나는 이것을 어떻게하는지 모른다. 지금까지 읽은 것에서도 가능하지 않은 것 같습니다. SortWithRemove 또는 그런 식으로 별도의 루틴을 작성하여이 문제를 해결할 수 있음을 알고 있지만 재정의가 가능한지 궁금합니다.

편집 : 아래의 제안에 따라 Sort을 덮어 쓰지 않고 확장 방법을 사용하기로 결정했습니다. 여기 내 코드입니다 :

Public Module Extensions 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub SortRemovingDuplicates(list As List(Of UniCatalogEntry)) 
     'filter out unwanted records 
    End Sub 

End Module 
+0

이 게시물과 같은 일을 시도는 제안 : http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq – Billy

+0

@Billy 나는 것 아니에요 제외 진정으로 중복 된 레코드 다루기. 생각해 줘서 고마워. – cjbarth

답변

1

Extension Method을 생성하여 중복을 정렬하고 제거하는 것이 좋습니다.

public static class Extensions 
{ 
    public static void SortAndRemoveDuplicates<T>(this IList<T> list) where T is IComparable 
    { 
     // add magic here... 
    } 
} 
+0

나는 이것을 시험해보고 싶다. 그러나 나는 단지 List (Of MyObject)를 확장하고 싶다. 가능한가? 컴파일러는 'T'를'Of MyObject'로 바꿀 때 좋아하지 않습니다. – cjbarth

+0

아,저기서 저의 대답을 업데이트하겠습니다. IComparable을 이미 구현했다고 말했기 때문에 T가 IComparable 인 곳에서 사용할 수 있으므로 제대로 작동해야합니다. – ShelbyZ

+0

제 질문에 변경된 사항을 포함 시켰습니다. 이것은 잘 처리되었고이 확장은'List (Of MyObject)'에만 적용됩니다. – cjbarth

3

List.Sort의하지 변화 의미를 수행합니다 (난 당신이 존재하지 않는하지 IList.Sort, 그 의미 있으리라 믿고있어)를. 당신이하는 경우 방법의 계약을 위반합니다.

정렬 할 때 중복을 제거해야하는 경우 적절한 새 번호을 작성합니다 (예 : SortWithoutDuplicates. 당신이하고자하는 것은 Liskov substitution principle입니다.

+0

나는 프로그래밍 개념조차 몰랐다. 그 점을 지적 해 주셔서 감사합니다. 'Sort '가 무엇을 의미 하는지를 바꾸고 싶다면 내 객체의 IComparable 인터페이스를 변경해야합니다. 그렇지 않으면'Sort'가 그대로 있어야합니다. 감사. – cjbarth