辞書に新しいアイテムを追加するか、既存のアイテムを更新する方法


235

一部のレガシーコードでは、新しいキー値アイテムの追加やキーがすでに存在する場合の値の更新を容易にするために、次の拡張メソッドを参照しています。

方法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バージョンで解消されましたか?

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

回答:


243

メソッド1をメソッド2に置き換えると問題が発生する可能性がありますか?

いいえ、使用しますmap[key] = value。2つのオプションは同等です。


Dictionary<>Hashtable:あなたはリフレクターを起動すると、両方のクラスのインデクサセッターを呼び出すことを確認this.Insert(key, value, add: false);し、addパラメータが重複するキーを挿入するときに、例外をスローする責任があります。したがって、動作は両方のクラスで同じです。


44

大丈夫。これはCreateNewOrUpdateExistingソースから削除map[key] = valueしてコードで直接使用することもできます。これは、開発者が通常は何をmap[key] = value意味するかを知っているため、これがより読みやすくなるためです。


22

古い質問ですが、.net 4.0は質問が書かれたときにすでに起動していたので、次の行を追加する必要があると思います。

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

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

高性能のシナリオで複数のスレッドを処理しない場合は、すでに与えられている回答map[key] = valueがより高速になります。

ほとんどのシナリオでは、このパフォーマンス上の利点はわずかです。もしそうなら、私はConcurrentDictionaryを使うことを勧めます:

  1. それはフレームワークにあります-よりテストされており、あなたはコードを保守する必要のある人ではありません
  2. スケーラブルです:マルチスレッドに切り替えた場合、コードはすでに準備されています

7

機能的には同等です。

map[key] = value2つではなく1つのルックアップを行うだけなので、パフォーマンスに関してはより速くなります。

スタイル的には、短いほど良い:)

ほとんどの場合、コードはマルチスレッドのコンテキストで正常に動作するように見えます。ただし、追加の同期がないとスレッドセーフではありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.