2012-07-27 20 views
9

क्यों ObservableCollectionRemoveAll विधि List जैसी विधि नहीं है?क्यों ObservableCollection में RemoveAll विधि नहीं है?

मैं ObservableCollection को यह सुविधा प्रदान करने के लिए एक विस्तार विधि को लागू किया है, लेकिन मैं अगर वहाँ इस कार्यक्षमता प्रदान नहीं करने के लिए एक विशेष कारण है समझने के लिए चाहते हैं।

यह संभवतः संग्रह परिवर्तन के कारण डाटा किसी तरह बाध्यकारी प्रभाव होगा? This पोस्ट कुछ ऐसी चीजें निर्दिष्ट करता है जो ObservableCollections का उपयोग करते समय गलत हो सकती हैं, लेकिन इस प्रश्न को संबोधित नहीं करती हैं।

+1

क्या आपने साफ़() विधि को देखा है? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik

+0

इसमें विधि साफ़() है, जो संग्रह से सभी तत्वों को हटा देती है। – Dante

+1

खैर, RemoveAll() विधि संग्रह को साफ़ करने का इरादा नहीं है। यहां तक ​​कि सूची में एक स्पष्ट() विधि है। इसका उद्देश्य उन सभी वस्तुओं को निकालना है जो एक निश्चित मानदंड से मेल खाते हैं। –

उत्तर

17

इसमें Clear() विधि है जो आपके द्वारा उपयोग किए जा सकने वाले सभी आइटम को हटा देती है।

अगर मैं करने के लिए के रूप में एक अनुमान खतरे को क्यों वे RemoveAll के बजाय Clear इस्तेमाल किया था, मुझे लगता है कि जबकि Clear आपको बताता है कि यह होगा क्योंकि RemoveAll सुझाव है कि आप संग्रह से आइटम निकाल रहे वहन करती है, आइटम बस को मंजूरी दे दी जा रही हैं ।

इससे CollectionChanged अधिसूचना के प्रकार में कोई फर्क पड़ता है जो उठाया जाता है। Clear()NotifyCollectionChangedAction.Clear ईवेंट बढ़ाता है और इसमें ईवेंट में हटाए गए आइटम शामिल नहीं होते हैं, जबकि RemoveNotifyCollectionChangedAction.Removed ईवेंट बढ़ाता है, और हटाए गए आइटम को ईवेंट में पास करता है।

You cannot raise a CollectionChanged event with multiple items, इसलिए NotifyCollectionChangedAction.Removed ईवेंट को हटाकर सभी आइटम हटा दिए गए अपवाद को फेंक दिया जाएगा। विकल्प हटाए गए प्रत्येक आइटम के लिए CollectionChanged ईवेंट को बढ़ाने का विकल्प होगा, जो प्रदर्शन के लिए काफी खराब हो सकता है। और बस NotifyCollectionChangedAction.Reset ईवेंट को बढ़ाने से कुछ भ्रम पैदा हो जाएंगे जब उपयोगकर्ता Removed ईवेंट की अपेक्षा कर रहे हैं जब वे आइटम हटा रहे हों।

तो मुझे लगता है कि उन्होंने .RemoveAll() के बजाय .Clear() का उपयोग करने का निर्णय लिया है क्योंकि नाम दृश्यों के पीछे वास्तव में क्या हो रहा है इसका एक बेहतर वर्णन है।

+0

मुझे लगता है कि यह बताता है। इस तरह के एक विस्तृत स्पष्टीकरण के लिए धन्यवाद। –

1

आप यह भी पूछ सकते हैं कि यह Reverse या किसी अन्य विधि को क्यों लागू नहीं करता है। सबसे सामान्य और बिल्कुल आवश्यक तरीकों से अधिक लागू करने का कोई कारण नहीं है। Add और Remove के बगल में सबकुछ बस सुविधा है। (RemoveAll लागू होने वाली सामान्य इंटरफेस का भी हिस्सा नहीं है, और उनके पास पहले से बहुत सारी विधियां हैं)

संबंधित मुद्दे