1. ホーム
  2. c#

[解決済み】キーが存在しない場合にデフォルト値を返すディクショナリ【重複

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();
}

(もちろん、引数チェックは入れてもいいかもしれません :)