2010-11-22 13 views
155

レガシーコードでは、キーがすでに存在する場合、新しいキー値アイテムの追加や値の更新を容易にする次の拡張メソッドがあります。辞書に新規アイテムを追加するか、既存アイテムを更新する方法

方法-1(レガシーコード)。

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value) 
{    
    if (map.ContainsKey(key)) 
    { 
     map[key] = value; 
    } 
    else 
    { 
     map.Add(key, value); 
    } 
} 

けれども、私はmap[key]=valueがまったく同じ仕事をしていることを確認しています。すなわち、この方法は以下の方法2に置き換えることができる。

方法2。

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value) 
{ 
    map[key] = value; 
} 

私の質問は..私が方法-1を方法-2で置き換えると問題はありますか?可能性のあるシナリオでは破綻するでしょうか?

また、これはHashTableとDictionaryの違いだと思います。 HashTableでは、アイテムを更新することができます。また、ディクショナリを使用して新しいアイテムを追加することはできません。この違いはC#3.0バージョンでは排除されていますか?

ユーザーが同じキー値を再度送信する場合、このメソッドの目的はあまりにも例外ではなく、メソッドは新しい値でエントリを更新するだけで、新しいキーと値のペアが新しい場合は新しいエントリを作成する必要がありますメソッドに送信します。

答えて

153

方法1を方法2に置き換えても問題はありませんか?

いいえ、ちょうどmap[key] = valueを使用してください。 2つのオプションは同等です。あなたはリフレクターを起動すると、両方のクラスのインデクサセッターがthis.Insert(key, value, /* add */ false);を呼び出し、addパラメータが重複するキーを挿入するときに、例外をスローする責任があることを参照してください。Dictionary<>Hashtableについて


。したがって、両方のクラスの動作は同じです。

29

問題はありません。私はCreateNewOrUpdateExistingをソースから削除して、map[key] = valueをコード内に直接使用します。なぜなら、これははるかに読みやすく、開発者は通常map[key] = valueの意味を知っているからです。

5

機能的には同等です。

パフォーマンスワイズmap[key] = valueは、2つではなく1つのルックアップを作成するので、より高速になります。

スタイルワイズ、短いよりよい:)

コードは、ほとんどの場合、マルチスレッドコンテキストで正常に動作するように見えるだろう。しかし、ではなく、余分な同期化なしでスレッドセーフです。

13

古い質問ですが、私は次のように追加する必要があります.net 4.0は質問が書かれた時点で既に起動していたためです。

.net 4.0からは、スレッドセーフなコレクションを含む名前空間System.Collections.Concurrentがあります。

コレクションSystem.Collections.Concurrent.ConcurrentDictionary<>は、あなたが欲しいものを正確に行います。スレッドセーフであるという利点が追加されたAddOrUpdate()メソッドがあります。

パフォーマンスの高いシナリオで複数のスレッドを処理していない場合は、すでに与えられた回答がmap[key] = valueより速い場合は、

ほとんどのシナリオで、このパフォーマンス上の利点は重要ではありません。あなたは切り替える場合:これは、より多くのそれは、スケーラブルでテストされ、あなたは、コード

  • を維持しなければならないものではないです - それは、フレームワークである

    1. :その場合ので、私はConcurrentDictionaryを使用することをお勧めしますあなたのコードをマルチスレッド化するには既にそれが用意されています
  • 関連する問題