7

ConcurrentDictionaryで、指定した値と等しい場合にのみ、キーでエントリを削除できるメソッドを探していました。これは、 TryUpdateと同等ですが、削除するためのものです。

これを行う唯一の方法は、次の方法のようです。

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

これはICollectionインターフェイスの明示的な実装です。つまり、Removeを呼び出すことができるように、最初にConcurrentDictionaryをICollectionにキャストする必要があります。

Removeは私が望むことを正確に実行し、そのキャストも大したことではありません。また、ソースコードは、bool matchValue =trueを指定してプライベートメソッドTryRemovalInternalを呼び出すことを示しているため、すべてがきれいに見えます。

ただし、少し心配なのは、ConcurrentDictionaryの楽観的に並行するRemoveメソッドとして文書化されていないため、http://msdn.microsoft.com/en-us/library/dd287153.aspxはICollectionボイラープレートを複製するだけです。方法:ConcurrentDictionaryからアイテムを追加および削除する方法についても、その方法については触れられていません。

それが進むべき道かどうか誰かが知っていますか、それとも私が見逃している他の方法がありますか?

4

2 に答える 2

5

公式ドキュメントではありませんが、このMSDNブログ投稿が役立つ場合があります。その記事の要点:質問で説明されているように、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));
}
于 2012-01-04T14:50:35.857 に答える
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");
    }
}

これは、追加と削除だけが必要で、スレッドセーフな反復が必要な状況で役立ちます。

于 2013-11-30T16:48:47.073 に答える