すべてのジェネリッククラスに影響する方法で、C#の次の例外で特定のキーの値を取得する方法はありますか?これは、Microsoftからの例外記述の大きなミスだと思います。
"The given key was not present in the dictionary."
より良い方法は次のとおりです。
"The given key '" + key.ToString() + "' was not present in the dictionary."
ソリューションには、ミックスインまたは派生クラスが含まれる場合があります。
この例外は、存在しないものにインデックスを作成しようとするとスローされます。次に例を示します。
Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];
多くの場合、オブジェクトのようなものがキーとなり、間違いなく取得が難しくなります。ただし、いつでも次のように記述できます(または拡張メソッドでラップすることもできます)。
if (test.ContainsKey(myKey))
return test[myKey];
else
throw new Exception(String.Format("Key {0} was not found", myKey));
またはより効率的(@ScottChamberlainに感謝)
T retValue;
if (test.TryGetValue(myKey, out retValue))
return retValue;
else
throw new Exception(String.Format("Key {0} was not found", myKey));
おそらくほとんどのオブジェクトで使用すると役に立たないため、Microsoftはこれを行わないことを選択しました。自分でできるほどシンプルなので、自分でロールバックしてください!
一般的な場合、答えはいいえです。
ただし、例外が最初にスローされた時点でブレークするようにデバッガーを設定できます。その時点で、存在しなかったキーは、呼び出しスタック内の値としてアクセス可能になります。
Visual Studioでは、このオプションは次の場所にあります。
デバッグ→例外...→共通言語ランタイムの例外→System.Collections.Generic
そこで、Thrownボックスをチェックできます。
コードがIDictionary<TKey, TValue>
を使用し、Dictionary<TKey, TValue>
に直接結び付けられていない場合、実行時に情報が必要なより具体的なインスタンスについては、この動作を提供する独自の辞書クラスを実装できます。
キーミスを管理する場合は、TryGetValueを使用する必要があります。
https://msdn.Microsoft.com/en-gb/library/bb347013(v = vs.110).aspx
string value = "";
if (openWith.TryGetValue("tif", out value))
{
Console.WriteLine("For key = \"tif\", value = {0}.", value);
}
else
{
Console.WriteLine("Key = \"tif\" is not found.");
}
このコードを試すことができます
Dictionary<string,string> AllFields = new Dictionary<string,string>();
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);
キーが存在しない場合は、単にnull値を返します。