Подтвердить что ты не робот

Данный ключ отсутствовал в словаре. Какой ключ?

Есть ли способ получить значение данного ключа в следующем исключении в С# таким образом, который влияет на все общие классы? Я думаю, что это большая ошибка в описании исключения из Microsoft.

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

Лучший способ:

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

Решения могут включать миксины или производные классы.

4b9b3361

Ответ 1

Это исключение генерируется при попытке индексировать то, что там не существует, например:

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 решила не делать этого, вероятно, потому, что это было бы бесполезно при использовании на большинстве объектов. Его достаточно просто сделать сами, так что просто бросьте свои собственные!

Ответ 2

В общем случае ответ No.

Тем не менее, вы можете настроить отладчик на разрыв в точке, где первое исключение. В то время ключ, который отсутствовал, будет доступен как значение в стеке вызовов.

В Visual Studio эта опция находится здесь:

Debug → Исключения... → Исходные данные об общедоступном языке Runtime → System.Collections.Generic

Здесь вы можете проверить флажок Брошенный.


Для более конкретных случаев, когда информация требуется во время выполнения, если ваш код использует IDictionary<TKey, TValue> и не привязан непосредственно к Dictionary<TKey, TValue>, вы можете реализовать свой собственный класс словаря, который обеспечивает это поведение.

Ответ 3

Если вы хотите управлять промахами ключей, вы должны использовать 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.");
}

Ответ 4

Вы можете попробовать этот код

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

Если ключ отсутствует, он просто возвращает нулевое значение.

Ответ 5

int value = ((OptionSetValue)orgEntity.Attributes["negativecurrencyformatcode"]).Value;

ОШИБКА: данный ключ отсутствует в словаре.

Ответ 6

string Value = dic.ContainsKey("Name") ? dic["Name"] : "Required Name"

С помощью этого кода мы получим строковые данные в "Значение". Если ключ "Name" существует в словаре "dic", извлеките это значение, в противном случае возвращает строку "Required Name".