2012-01-04 11 views
7

ConcurrentDictionaryのメソッドを探していました。値が指定された値と等しい場合にのみ、キーでエントリを削除できます。TryUpdate削除のためにConcurrentDictionaryの楽観的同時並行削除メソッド

これを行う唯一の方法は、この方法のようだ:

ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair) 

それはICollectionインターフェイスの明示的な実装である、言い換えれば、私はそのように、第1 ICollectionへの私のConcurrentDictionaryをキャストする必要があり削除を呼び出すことができます。

削除は、ソースコードがプライベートメソッドTryRemovalInternalをbool matchValue = trueと呼んでいることを示しています。ビットしかし私を心配何

はそれがとてもhttp://msdn.microsoft.com/en-us/library/dd287153.aspxだけICollectionを定型文を複製し、How to: Add and Remove Items from a ConcurrentDictionaryはどちらかその方法を言及していない、ConcurrentDictionaryの楽観的同時Removeメソッドとして文書化されていないという事実です。

誰かがその方法を知っていますか、それとも私が行方不明の方法がありますか?

+0

これは 'TryRemove'の呼び出しと同じメソッドで、' matchValue'がfalseに設定され、 'oldValue'がデフォルトに設定されているのと同じ方法ですので) –

+2

正式な文書ではありませんが、http://blogs。 msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx – alexm

+0

@alexmこれは十分に安心しています。これを回答にすると、私はそれを受け入れます! MSは実際には、最近彼らが "ConcurrentDictionaryに対するさらなるサポートを求めるいくつかの人たちを見た"と言えば、実際にドキュメントを更新しなければなりません... –

答えて

4

公式の文書ではありませんが、this MSDN blog postが役に立ちます。その記事の主旨は:ICollectionにキャスティングし、質問に記載されているようにRemoveメソッドを呼び出すことです。ここで

TryRemove拡張メソッドにそれをラップ上記のブログ記事からの抜粋、です:

public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
{ 
    if (dictionary == null) 
     throw new ArgumentNullException("dictionary"); 
    return ((ICollection<KeyValuePair<TKey, TValue>>)dictionary).Remove(
     new KeyValuePair<TKey, TValue>(key, value)); 
} 
0

あなたはすべての鐘にConcurrentDictionaryの&ホイッスルを必要としない場合は、同じように自分の型を宣言することができますIDictionary。

public class ClassThatNeedsDictionary 
{ 
    private readonly IDictionary<string, string> storage; 

    public ClassThatNeedsDictionary() 
    { 
     storage = new ConcurrentDictionary<string, string>(); 
    } 

    public void TheMethod() 
    { 
     //still thread-safe 
     this.storage.Add("key", "value"); 
     this.storage.Remove("key"); 
    } 
} 

私はあなただけの追加と削除する必要があるが、それでもスレッドセーフな繰り返しをしたいている状況で、これは便利。

+0

ConcDicを使う場所にシナリオがありますが、それらを渡って来ていない。しかし、もしあれば、あなたの提案は確かにそのキャストを冗長にするだろう。 Otoh、私はこれがとにかく "コンパイル時のキャスト"だと確信しているので、パフォーマンスペナルティはまったくありません。ちょっとやや醜いコード。 –

+0

ディクショナリにオブジェクトを追加および削除する際に、反復処理を同時に実行する場合。 ConcurrentDictionaryはキー・スナップショットを提供するため、例外は発生しません。 – greyalien007

関連する問題