2012-07-27 201 views
0

我已使用ObservableCollectionDataBinding在我的WPF應用程序中,其中我將該集合綁定到DataGridsComboBoxes。由於需求,在需要根據條件從集合中刪除對象時,我實現了RemoveAll功能,如List,使用Extension method擴展方法或繼承?

This職位指定的Inheritance幾個優點超過Extension methods,但不是我的情況很特殊,因爲這是我需要添加的唯一方法,我不打算再添Extension method的集合。

我想知道對我來說這樣做對我來說應該是Extension method,還是應該考慮繼承這個類並將其添加爲Instance method

此外,我想知道兩者之間是否有任何性能差異,因爲它在上述帖子中沒有討論過。

+0

考慮使用'Clear'作爲名稱,因爲這是清除列表中的所有內容的好方法。另一點是,如果可用,編譯器將使用對象 - Clear的實現(性能通常更好)。 – 2012-07-27 14:03:37

+0

那麼,Clear()將刪除所有內容,這不是我的觀點。 – 2012-07-27 14:04:38

+0

ahh,我忘記了RemoveAll使用predicat-Delegate ......對不起!你絕對正確 – 2012-07-27 14:05:44

回答

2

爲了一種方法,我會使用擴展方法。在這種情況下,這意味着您的代碼可以繼續使用ObservableCollection<T>而不需要維護自定義類型。

擴展方法簡單歸結爲編譯時的靜態方法調用,所以我無法想象性能會比繼承性差。如果有的話應該是相同或更好的。

個人喜好通常是驅動選擇擴展方法的原因。

+0

謝謝。這回答了我的問題。 +1。 – 2012-07-27 14:02:22

4

如果您計劃僅增強ObservableCollection而不僅僅是RemoveAll(),那麼將其子類化並添加您的功能。如果您想將RemoveAll()添加到ObservableCollection中,那麼您可以創建一個擴展方法,該方法不僅可以處理ObservableCollections,還可以通過在heirarchy中定位IEnumerable或另一個通用父項。在該方法中,您可以測試該集合是否支持CollectionChanged,並對其進行適當處理。

這裏沒有正確或錯誤的答案,這是任何適合您的需求。

+0

+1好點! – 2012-07-27 13:54:13

+0

好吧,正如我已經指定的那樣,我不打算添加任何其他功能,而且我經常使用IList時,我不必做任何綁定,並且已經有了方法,我不認爲我需要擴展這對任何其他類型。但好點(+1),我可能會在未來使用這個建議。 – 2012-07-27 13:59:42

1

使用擴展方法,您可以擴展接口,從而擴展該接口的每個實現者。

我會用擴展方法System.Collections.IList來做。 System.Collections.IList使用無處不在...

public class static Extension 
{ 
    public static void RemoveAll(this System.Collections.IList list) 
    { 
     ... 
    } 
} 

這將延長几乎所有集合實現。

+0

好吧,這看起來不錯,但我想我現在不需要將此功能擴展到其他類型。但一個很好的建議。 +1。 – 2012-07-27 14:01:04