2010-03-03 25 views
8

.NET Framework में संस्करण 3.0 के बाद ObservableCollection<T> है, लेकिन वहां कोई अवलोकन करने योग्य KeyedCollection < TKey, TValue > क्यों नहीं है।.NET Framework में कोई पर्यवेक्षित KeyedCollection <TKey, TValue> क्यों नहीं है?

ठीक है, मैं KeyedCollection<TKey,TValue> से प्राप्त करके अपने संग्रह को कार्यान्वित कर सकता हूं और INotifyCollectionChanged इंटरफेस को कार्यान्वित कर सकता हूं, लेकिन यह .NET Framework के लिए एक अच्छा जोड़ा नहीं है।

उत्तर

2

कारण कोई ObservableKeyedCollection (या किसी अन्य तरह के प्रकार है जो केवल अन्य सामान्य प्रकार का एक संयोजन है), क्योंकि ObservableCollection सामान्य है वहाँ है, और है कि इस के रूप में आसान के रूप में एक "ObservableKeyedCollection" के कार्यान्वयन करता है कि:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 

public class DictionaryWatcher : ObservableCollection<KeyValuePair<string, object>>, IDisposable 
{ 
    private NotifyCollectionChangedEventHandler watcher; 
    private bool watching = false; 

    public DictionaryWatcher() 
    { 
     watcher = new NotifyCollectionChangedEventHandler(ReportChange); 
     CollectionChanged += watcher; 
     Watched = true; 
    } 

    public bool Watched 
    { 
     get 
     { 
      return watching; 
     } 

     set 
     { 
      if (watching) 
      { 
       lock (this) 
       { 
        CollectionChanged -= watcher; 
        watching = false; 
       } 
      } 
     } 
    } 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

    public void Initialize() 
    { 
     this.Add(new KeyValuePair<string, object>("First", 1)); 
     this.Add(new KeyValuePair<string, object>("Second", 2)); 
     this.Add(new KeyValuePair<string, object>("Turd", 3)); 
     KeyValuePair<string, object> badValue = this[2]; 
     this.Remove(badValue); 
    } 

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing && Watched) 
    { 
     Watched = false; 
    } 
} 

    private void ReportChange(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     Console.WriteLine("Change made: {0}", e.Action); 
    } 
} 

हालांकि यह निश्चित रूप से एक लाइनर प्रोग्राम नहीं है, इसमें से अधिकांश बॉयलरप्लेट है। सबसे महत्वपूर्ण बात यह है कि यह ObservableCollection को फिर से कार्यान्वित नहीं करता है जैसा आप सुझाव दे रहे थे; इसके बजाय यह पूरी तरह से इसका उपयोग करता है।

कारण यह है कि ".NET Framework के लिए एक अच्छा जोड़ा नहीं होना चाहिए" क्योंकि ऐसा करने के लिए पहले से ही एक तरीका है, ऐसा करने का एक और तरीका बनाना एक बुरा विचार है। कुछ विशेष कार्य करने के लिए कम तरीके हैं, कम तरीके से इसे कम करने के तरीके हैं। 8)

उपकरण प्रदान किए जाते हैं, अब यह सब कुछ है कि आप उनका उपयोग कैसे करते हैं।

आशा है कि मदद करता है!

+9

KeyedCollection में बहुत सी चीजें उपलब्ध हैं जो आपके समाधान में नहीं हैं। उदाहरण के लिए कुंजी पर आधारित एक सूचकांक, एक ही कुंजी के साथ आइटम जोड़ने से रोकें, इसलिए उपरोक्त कोड बॉयलरप्लेट हो सकता है, लेकिन यह निश्चित रूप से पूरा नहीं हुआ है। फ्रेमवर्क हमें ऐसे टूल देने के लिए है जो न केवल उपयोग करने में आसान हैं, बल्कि उनके कार्यान्वयन में भी पूर्ण हैं ... –

+3

मैं जेरोइन से सहमत हूं। इस उत्तर में KeyedCollection की मौलिक क्षमताओं नहीं हैं। मैं यह भी इंगित करना चाहता हूं कि यदि पर्यवेक्षीकेड कोलेक्शन ढांचे द्वारा प्रदान किया गया था, तो हमारे पास ऐसा करने के लिए सबसे कम संभव तरीके होंगे - 1 - हर किसी के अपने स्वयं के समाधान बनाने के बजाए, जिनमें से कई इस तरह टूटे जाएंगे। – totorocat

1

मैं आपको C5 पर एक नज़र डालने की सलाह दूंगा। यह एक अद्भुत जेनेरिक संग्रह पुस्तकालय है जो Added, Inserted, Removed, RemovedAt, Cleared, और Changed समेत अपने सभी संग्रहों के लिए मानक के रूप में देखने योग्य संग्रह प्रदान करता है। इसके अतिरिक्त, सी 5 संग्रह सभी "इंटरफ़ेस से प्रोग्रामिंग" आदर्श का समर्थन करते हैं। सभी इंटरफेस अंतर्निहित कार्यान्वयन की पूरी कार्यक्षमता का खुलासा करते हैं — जिसमें System.Collections.Generic नामस्थान में कमी है। इसके अतिरिक्त, documentation पूरी तरह से है। मैं आपको इसे जांचने के लिए प्रोत्साहित करता हूं।