72

作業中のプログラムの検索を実行するために辞書を使用しています。ディクショナリを介して一連のキーを実行しますが、一部のキーには値がないことが予想されます。発生した場所で右をキャッチしKeyNotFoundException、吸収します。他のすべての例外は一番上に伝播します。これはこれを処理する最良の方法ですか?または、別のルックアップを使用する必要がありますか? ディクショナリは int をキーとして使用し、カスタム クラスを値として使用します。

4

6 に答える 6

139

Dictionary.TryGetValue代わりに使用してください:

Dictionary<int,string> dictionary = new Dictionary<int,string>();
int key = 0;
dictionary[key] = "Yes";

string value;
if (dictionary.TryGetValue(key, out value))
{
    Console.WriteLine("Fetched value: {0}", value);
}
else
{
    Console.WriteLine("No such key: {0}", key);
}
于 2009-03-03T14:42:52.480 に答える
37

使ってみてください: Dict.ContainsKey

編集:
パフォーマンスDictionary.TryGetValueに関しては、他の人が示唆したように優れていると思いますが、必要のないときに Out を使用するのは好きではないので、私の意見では、ContainsKey の方が読みやすいですが、値も必要な場合はより多くのコード行が必要です。

于 2009-03-03T14:42:44.257 に答える
33

を使用した 1 行のソリューションTryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!";

変数は、この場合string辞書が返す型でなければならないことに注意してください。ここでは、変数宣言にvarを使用できません。

C# 7 を使用している場合は、 varを含めてインラインで定義できます。

string value = dictionary.TryGetValue(key, out var tmp) ? tmp : "No key!";

dict.GetOrDefault("Key") または dict.GetOrDefault("Key", "No value") を達成したいことを正確に行う素晴らしい拡張メソッドもあります

public static TValue GetOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
      if (dictionary != null && dictionary.ContainsKey(key))
      {
           return dictionary[key];
      }
      return defaultValue;
 }
于 2014-08-04T21:10:31.957 に答える
16

これは1行の解決策です(これによりルックアップが2回行われることに注意してください。長時間実行ループで使用する必要があるこれのtryGetValueバージョンについては、以下を参照してください。)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";

それでも、辞書にアクセスするたびにこれを行う必要があります。null を返すことを好むので、次のように書くことができます。

string value = dictionary[key] ?? "default";//this doesn't work
于 2013-07-02T22:50:30.960 に答える
5

Dictionary の 'ContainsKey(string key)' メソッドを使用して、キーが存在するかどうかを確認する必要があります。通常のプログラム フローに例外を使用することは、適切な方法とは見なされません。

于 2009-03-03T14:44:47.327 に答える
5

私はこれが古いスレッドであることを知っていますが、それが役立つ場合、以前の回答は素晴らしいですが、複雑さのコメントとコードのポイ捨ての懸念 (すべて私にとっても有効です) に対処できます。

カスタム拡張メソッドを使用して、上記の回答の複雑さをより洗練された形式でまとめ、コード全体に散らばらないようにし、 null 合体演算子 の優れたサポートを有効にします。. . パフォーマンスを最大化しながら(上記の回答を介して)。

namespace System.Collections.Generic.CustomExtensions
{
    public static class DictionaryCustomExtensions
    {
        public static TValue GetValueSafely<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
        {
            TValue value = default(TValue);
            dictionary.TryGetValue(key, out value);
            return value;
        }
    }
}

次に、名前空間System.Collections.Generic.CustomExtensionsをインポートするだけで使用できます

string value = dictionary.GetValueSafely(key) ?? "default";
于 2019-02-13T20:53:13.333 に答える