8

.NET Framework にはバージョン 3.0 以降ObservableCollection<T>が含まれていますが、ObservableKeyedCollection<TKey, TValue> がないのはなぜですか。

さて、KeyedCollection<TKey,TValue>から派生させてINotifyCollectionChangedインターフェイスを実装することで、独自のコレクションを実装することはできますが、.NET Framework への適切な追加にはなりません。

4

3 に答える 3

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を再実装しないことです。代わりにそれを完全に利用します。

それが「.NETFrameworkへの良い追加ではない」理由は、何かを行う方法がすでに1つある場合、それを行う別の方法を作成することは悪い考えだからです。特定のタスクを実行する方法が少なければ少ないほど、それをうまく実行する方法も少なくなります。8)

ツールが提供されています。これで、ツールの使用方法がすべてになります。

お役に立てば幸いです。

于 2010-03-04T17:11:02.357 に答える
2

ObservableKeyedCollection クラスの実装を見てください。とても簡単です。

于 2011-08-04T10:59:02.533 に答える
1

C5をご覧になることをお勧めします。AddedInsertedRemovedRemovedAtClearedおよびを含むすべてのコレクションの標準として監視可能なコレクションを提供する、素晴らしいジェネリック コレクション ライブラリですChanged。さらに、C5 コレクションはすべて「インターフェースへのプログラミング」の理想を支持しています。提供されるすべてのインターフェースは、基礎となる実装の完全な機能を公開しますが、これはSystem.Collections.Generic名前空間にはありません。さらに、完全なドキュメントがあります。ぜひチェックしてみてください。

于 2010-08-27T14:59:43.253 に答える