2011-08-26 21 views
0

我有一個List(Of MyObject),我需要進行排序。所以我確信實現IComparableIEquatableIEqualityComparerIComparer和排序工作正常。超載List.Sort

有新的項目的新要求。排序列表不能包含「重複」對象。在這種情況下,重複與爲重排目的定義重複的方式略有不同。我創建了一個新的例程來檢查兩個對象並返回首選對象。首選的是除了一個以外所有值都相同的值,最後一個值是最大值。我已經使這個例程運行良好。

現在我很想通過創建繼承IList(Of MyObject)一個對象,然後重寫Sort方法首先刪除「重複」來解決這個「刪除重複項」的問題,然後使用IComparable接口作爲List排序通常會sort本身。不過,我不知道該怎麼做。從我目前閱讀的內容看,這似乎不是可能的。我知道我可以只是創造像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)',那有可能嗎?當我用'MyObject'替換'T'時,編譯器似乎不喜歡。 – 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