Платформа.NET содержит начиная с версии 3.0 ObservableCollection Хорошо я мог реализовать свой собственный набор путем получения из KeyedCollection
Причина отсутствия 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)
Инструменты предоставлены, теперь все зависит от того, как вы их используете.
Надеюсь, это поможет!
Рекомендую взглянуть на C5. Это замечательная универсальная библиотека коллекций, которая предлагает наблюдаемые коллекции в качестве стандарта для всех своих коллекций, включая Added
, Inserted
, Removed
, RemovedAt
. ], Очищено
и Изменено
. Кроме того, все коллекции C5 поддерживают идеал «программирования для интерфейса». Все интерфейсы предоставляют полную функциональность базовых реализаций, чего не хватает в пространстве имен System.Collections.Generic
. Кроме того, имеется подробная документация. Я настоятельно рекомендую вам проверить это.