[解決済み】辞書に新しい項目を追加したり、既存の項目を更新する方法
2022-04-16 04:40:54
質問
レガシーコードの中に、新しいキーと値のアイテムを追加したり、キーがすでに存在する場合に値を更新したりするための、以下の拡張メソッドを見かけました。
方法-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はindexerを使うことで項目の更新や新規追加が可能ですが、Dictionaryはそうではありません!!!。C# > 3.0のバージョンでこの差はなくなったのでしょうか?
このメソッドの目的は、ユーザーが同じキー-値を再度送信した場合に例外をスローしすぎないようにすることです。
解決方法は?
<ブロッククオート方法1を方法2に置き換えた場合、何か問題があるのでしょうか?
いいえ、単に
map[key] = value
. この2つのオプションは同等です。
について
Dictionary<>
vs.
Hashtable
: Reflector を起動すると、両方のクラスのインデックスセッターから
this.Insert(key, value, add: false);
であり
add
パラメータは、重複するキーを挿入したときに例外をスローする役割を担っています。したがって、動作はどちらのクラスでも同じです。
関連
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] C#でDictionaryに格納された値を更新する方法は?
-
[解決済み] Pythonで新しい辞書を作成する
-
[解決済み】どちらがより効率的か。ディクショナリ TryGetValue と ContainsKey+Item のどちらが効率的ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】WebResource.axdとは何ですか?