[解決済み】キーが存在しない場合にデフォルト値を返すディクショナリ【重複
2022-04-02 01:11:08
質問
<余談
この質問には、すでにここで回答があります
:
クローズド
8年前
.
私は最近、自分のコードで現在のパターンをよく使っていることに気づきました。
var dictionary = new Dictionary<type, IList<othertype>>();
// Add stuff to dictionary
var somethingElse = dictionary.ContainsKey(key) ? dictionary[key] : new List<othertype>();
// Do work with the somethingelse variable
または時々
var dictionary = new Dictionary<type, IList<othertype>>();
// Add stuff to dictionary
IList<othertype> somethingElse;
if(!dictionary.TryGetValue(key, out somethingElse) {
somethingElse = new List<othertype>();
}
どちらも遠回りな感じがします。私が本当に望むのは、次のようなものです。
dictionary.GetValueOrDefault(key)
さて、これをやってくれる辞書クラスの拡張メソッドを書くこともできますが、すでに存在するものを見逃しているかもしれないと思いました。そこで、dictionaryに拡張メソッドを書くことなく、もっと目に優しい方法でこれを行う方法はないでしょうか?
どのように解決するのですか?
TryGetValue
は、すでにその型のデフォルト値が辞書に割り当てられているので、それを使うだけでよい。
dictionary.TryGetValue(key, out value);
で、戻り値は無視すればよい。しかし、それは本当に
は
を返すだけです。
default(TValue)
であり、カスタムのデフォルト値ではありません(もっと便利なのは、デリゲートを実行した結果でもあります)。フレームワークには、これ以上強力なものは組み込まれていないのです。私は2つの拡張メソッドを提案します。
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue defaultValue)
{
return dictionary.TryGetValue(key, out var value) ? value : defaultValue;
}
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
Func<TValue> defaultValueProvider)
{
return dictionary.TryGetValue(key, out var value) ? value : defaultValueProvider();
}
(もちろん、引数チェックは入れてもいいかもしれません :)
関連
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 辞書をキーでソートするにはどうしたらいいですか?
-
[解決済み] ディクショナリーで最大値を持つキーを取得する?
-
[解決済み] 辞書の値でキーを取得する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】どちらがより効率的か。ディクショナリ TryGetValue と ContainsKey+Item のどちらが効率的ですか?
-
[解決済み] IDictionaryの実装で、キーが見つからない場合、throwではなく、デフォルト値を返すものはありますか?