1. ホーム
  2. c#

[解決済み] IDictionaryの実装で、キーが見つからない場合、throwではなく、デフォルト値を返すものはありますか?

2022-05-05 17:01:13

質問

へのインデクサは Dictionary は、キーが見つからない場合、例外を投げます。 の実装はありますか? IDictionary を返す代わりに default(T) ?

については知っています。 TryGetValue() というメソッドがありますが、これはLINQで使うのは無理です。

これなら効率よく必要なことができるかな?

myDict.FirstOrDefault(a => a.Key == someKeyKalue);

Hashのルックアップではなく、キーをイテレートすると思うので、そうはならないと思います。

どのように解決するのですか?

確かに、それでは全く効率的ではありませんね。

コメント通り、.Net Core 2+ / NetStandard 2.1+ / Net 5で。 MSは、拡張メソッド GetValueOrDefault()

それ以前のバージョンでは、拡張メソッドを自分で書くことができます。

public static TValue GetValueOrDefault<TKey,TValue>
    (this IDictionary<TKey, TValue> dictionary, TKey key)
{
    TValue ret;
    // Ignore return value
    dictionary.TryGetValue(key, out ret);
    return ret;
}

あるいは、C# 7.1を使って。

public static TValue GetValueOrDefault<TKey,TValue>
    (this IDictionary<TKey, TValue> dictionary, TKey key) =>
    dictionary.TryGetValue(key, out var ret) ? ret : default;

を使っていること。

  • 式言語化されたメソッド(C# 6)
  • out 変数 (C# 7.0)
  • デフォルトのリテラル(C# 7.1)