Почему не там никакой ObservableKeyedCollection <TKey, TValue> в Платформе.NET?

Платформа.NET содержит начиная с версии 3.0 ObservableCollection , но почему не там ObservableKeyedCollection .

Хорошо я мог реализовать свой собственный набор путем получения из KeyedCollection и реализации интерфейса INotifyCollectionChanged, но whouldn´t это быть хорошим дополнением к Платформе.NET.

8
задан Jehof 11 May 2011 в 10:04
поделиться

2 ответа

Причина отсутствия ObservableKeyedCollection (или любого другого такого типа, который представляет собой просто комбинацию других универсальных типов) заключается в том, что ObservableCollection является универсальным, и это делает реализацию ObservableKeyedCollection столь же простой, как this:

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)

Инструменты предоставлены, теперь все зависит от того, как вы их используете.

Надеюсь, это поможет!

2
ответ дан 5 December 2019 в 23:14
поделиться

Рекомендую взглянуть на C5. Это замечательная универсальная библиотека коллекций, которая предлагает наблюдаемые коллекции в качестве стандарта для всех своих коллекций, включая Added, Inserted, Removed, RemovedAt. ], Очищено и Изменено. Кроме того, все коллекции C5 поддерживают идеал «программирования для интерфейса». Все интерфейсы предоставляют полную функциональность базовых реализаций, чего не хватает в пространстве имен System.Collections.Generic. Кроме того, имеется подробная документация. Я настоятельно рекомендую вам проверить это.

1
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: