web-dev-qa-db-ja.com

指定されたキーは辞書に存在しませんでした。どのキー?

すべてのジェネリッククラスに影響する方法で、C#の次の例外で特定のキーの値を取得する方法はありますか?これは、Microsoftからの例外記述の大きなミスだと思います。

"The given key was not present in the dictionary."

より良い方法は次のとおりです。

"The given key '" + key.ToString() + "' was not present in the dictionary."

ソリューションには、ミックスインまたは派生クラスが含まれる場合があります。

60
Andreas

この例外は、存在しないものにインデックスを作成しようとするとスローされます。次に例を示します。

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はこれを行わないことを選択しました。自分でできるほどシンプルなので、自分でロールバックしてください!

56
BradleyDotNET

一般的な場合、答えはいいえです。

ただし、例外が最初にスローされた時点でブレークするようにデバッガーを設定できます。その時点で、存在しなかったキーは、呼び出しスタック内の値としてアクセス可能になります。

Visual Studioでは、このオプションは次の場所にあります。

デバッグ→例外...→共通言語ランタイムの例外→System.Collections.Generic

そこで、Thrownボックスをチェックできます。


コードがIDictionary<TKey, TValue>を使用し、Dictionary<TKey, TValue>に直接結び付けられていない場合、実行時に情報が必要なより具体的なインスタンスについては、この動作を提供する独自の辞書クラスを実装できます。

14
Sam Harwell

キーミスを管理する場合は、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.");
}
6
gabba

このコードを試すことができます

Dictionary<string,string> AllFields = new Dictionary<string,string>();  
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);

キーが存在しない場合は、単にnull値を返します。

0
Nitika Chopra