[解決済み] なぜDictionaryにはAddRangeがないのですか?
質問
タイトルは基本的なものなのに、なぜできないのでしょう。
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.AddRange(MethodThatReturnAnotherDic());
どのように解決するのですか?
元の質問に対するコメントは、このことをよく要約しています。
なぜなら、誰もその機能を設計、指定、実装、テスト、文書化、そして出荷したことがなかったからです。- Gabe Moothart
その理由は?おそらく、辞書をマージする動作は、フレームワークのガイドラインに適合する方法で推論することができないからでしょう。
AddRange
は存在しません。なぜなら、データの範囲は重複したエントリを可能にするため、範囲は連想コンテナに何の意味も持たないからです。例えば、もし
IEnumerable<KeyValuePair<K,T>>
があったとして、そのコレクションは重複したエントリをガードしません。
キーと値のペアのコレクションを追加する動作、あるいは2つの辞書をマージする動作は、単純明快です。しかし、複数の重複するエントリをどのように扱うかという動作はそうではありません。
重複を処理するときのメソッドの動作はどうあるべきでしょうか?
私が思いつく解決策は少なくとも3つあります。
- に対して例外を投げる。 最初 のエントリが重複している場合、例外を投げます。
- すべての重複するエントリを含む例外をスローします。
- 重複を無視する
例外が発生したとき、元の辞書の状態はどうなっているべきでしょうか?
Add
はほとんど常にアトミックな操作として実装されます。成功すればコレクションの状態が更新され、失敗すればコレクションの状態は変更されないままです。として
AddRange
は重複したエラーによって失敗することがあるので、 その挙動を
Add
との一貫性を保つ方法は、重複した場合に例外を投げることでアトミックにし、元の辞書の状態を変更しないままにすることです。
API の利用者として、重複する要素を繰り返し削除しなければならないのは面倒なことです。
AddRange
を含む単一の例外を投げる必要があります。
すべて
を含む単一の例外を投げるべきです。
そうすると、選択は以下のようになります。
- すべての重複に対して例外をスローし、元の辞書はそのままにします。
- 重複を無視して処理を進めます。
両方のユースケースをサポートするための議論があります。そのためには
IgnoreDuplicates
フラグを署名に追加しますか?
は
IgnoreDuplicates
フラグ (True に設定した場合) は、根本的な実装が重複チェックのコードをバイパスするため、大幅なスピードアップも提供します。
では、フラグを設定することで
AddRange
をサポートするフラグがありますが、文書化されていない副作用があります (これはフレームワークの設計者が避けるために本当に懸命に努力したことです)。
概要
重複を処理することになると、明確で一貫した期待される動作がないため、一括して処理しない方が簡単で、そもそもメソッドを提供しません。
辞書をマージする必要が常にあることに気付いた場合、もちろん、アプリケーションに適した方法で動作する、辞書をマージする独自の拡張メソッドを書くことができます。
関連
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] 辞書から要素を削除する
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
最新
-
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 は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】C#で辞書をマージする