作業中のプログラムの検索を実行するために辞書を使用しています。ディクショナリを介して一連のキーを実行しますが、一部のキーには値がないことが予想されます。発生した場所で右をキャッチしKeyNotFoundException
、吸収します。他のすべての例外は一番上に伝播します。これはこれを処理する最良の方法ですか?または、別のルックアップを使用する必要がありますか? ディクショナリは int をキーとして使用し、カスタム クラスを値として使用します。
6 に答える
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);
}
使ってみてください: Dict.ContainsKey
編集:
パフォーマンスDictionary.TryGetValue
に関しては、他の人が示唆したように優れていると思いますが、必要のないときに Out を使用するのは好きではないので、私の意見では、ContainsKey の方が読みやすいですが、値も必要な場合はより多くのコード行が必要です。
を使用した 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;
}
これは1行の解決策です(これによりルックアップが2回行われることに注意してください。長時間実行ループで使用する必要があるこれのtryGetValueバージョンについては、以下を参照してください。)
string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";
それでも、辞書にアクセスするたびにこれを行う必要があります。null を返すことを好むので、次のように書くことができます。
string value = dictionary[key] ?? "default";//this doesn't work
Dictionary の 'ContainsKey(string key)' メソッドを使用して、キーが存在するかどうかを確認する必要があります。通常のプログラム フローに例外を使用することは、適切な方法とは見なされません。
私はこれが古いスレッドであることを知っていますが、それが役立つ場合、以前の回答は素晴らしいですが、複雑さのコメントとコードのポイ捨ての懸念 (すべて私にとっても有効です) に対処できます。
カスタム拡張メソッドを使用して、上記の回答の複雑さをより洗練された形式でまとめ、コード全体に散らばらないようにし、 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";