1. ホーム
  2. c#

ディクショナリ値の取得のベストプラクティス

2023-09-17 05:53:13

質問

つい最近、私は Dictionary.TryGetValue(TKey key, out TValue value) に気づき、Dictionary から値を取得するためのより良いアプローチがどれなのか興味を持ちました。

私は従来から

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

知らない限り がある が入っていなければなりません。

するだけで良いのでしょうか。

if (myDict.TryGetValue(somekey, out someVal)
    ...

どちらがより良い方法なのでしょうか?どちらが速いのでしょうか?Tryバージョンは、try/catchを自分自身の中に「飲み込み」、それをロジックとして使用するので、より遅くなると想像していますが、違いますか?

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

TryGetValueはFindEntryが一度だけ呼び出されるため、若干速くなります。

どの程度速いですか?それは データセットによります。を呼び出すと メソッドを呼び出すと、Dictionary はインデックスを見つけるために内部検索を行います。 はそのインデックスを見つけるために内部検索を行います。もし が真を返した場合、実際の値を取得するために別の を返した場合、実際の値を取得するために別のインデックス検索が必要です。 TryGetValueを使用すると、インデックスを1回だけ検索します。 を使用すると、インデックスを1回だけ検索し、見つかった場合は 変数に値を代入します。

参考:実際にはエラーをキャッチしていません。

呼び出しているのです。

public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

ContainsKeyはこれ。

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}