سؤال

يحتوي .NET Framework منذ الإصدار 3.0 ObservableCollectionu003CT>, ، ولكن لماذا لا يوجد rocarablekeyedCollectionu003CTKey, TValue> .

حسنًا ، يمكنني تنفيذ مجموعتي الخاصة عن طريق الاستخلاص من KeyedCollectionu003CTKey,TValue> وتنفيذ inotifyCollectionChanged واجهة ، ولكن Whouldn´t تكون إضافة جيدة إلى .NET Framework.

هل كانت مفيدة؟

المحلول

السبب في عدم وجود rocarablekeyedCollection (أو أي نوع آخر من هذا القبيل وهو مجرد مزيج من الأنواع العامة الأخرى) هو بسبب ObservableCollection عام ، وهذا يجعل تنفيذ "rocaretableKeyedCollection" سهلاً مثل هذا:

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 );
    }
}

على الرغم من أن هذا ليس بالتأكيد برنامجًا واحدًا ، إلا أن معظمه هو Boilerplate. الأهم من ذلك ، لا يعيد تنفيذ ObservableCollection كما كنت تقترح بدلاً من ذلك ، يستخدمه بالكامل.

السبب في أنه "لا يكون إضافة جيدة إلى .NET Framework" هو أنه عندما يكون هناك بالفعل طريقة لفعل شيء ما ، فإن خلق طريقة أخرى للقيام بذلك هو فكرة سيئة. الطرق الأقل هناك لإنجاز بعض المهام المعينة ، والطرق الأقل من الطرق للقيام بذلك بشكل سيء. 8)

يتم توفير الأدوات ، الأمر كله الآن عن كيفية استخدامك لها.

امل ان يساعد!

نصائح أخرى

الرجاء إلقاء نظرة على ObcessableKeyedCollection فئة التنفيذ. إنه أمر سهل للغاية.

أوصيك بإلقاء نظرة على C5. إنها مكتبة تجميع عامة رائعة تقدم مجموعات يمكن ملاحظتها كمعيار لجميع مجموعاتها ، بما في ذلك Added, Inserted, Removed, RemovedAt, Cleared, ، و Changed. بالإضافة إلى ذلك ، تتبنى جميع مجموعات C5 "البرمجة إلى الواجهة" المثالية. توفر جميع الواجهات الكشف عن الوظائف الكاملة للتطبيقات الأساسية - والتي تفتقر إلى System.Collections.Generic مساحة الاسم. بالإضافة إلى ذلك ، هناك شامل توثيق. أنا أشجعك بشدة على التحقق من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top