Почему в .NET Framework нет ObservableKeyedCollection <TKey, TValue>? - PullRequest
8 голосов
/ 03 марта 2010

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

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

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Пожалуйста, взгляните на реализацию класса ObservableKeyedCollection . Это довольно просто.

2 голосов
/ 04 марта 2010

Причина, по которой отсутствует 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)

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

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

1 голос
/ 27 августа 2010

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

...