2015-06-03 2 views
0

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

int myInt; 

try 
{ 
    myInt = {Value From Dictionary}; 
} 
catch 
{ 
    myInt = 0; 
} 

Любой вход? Благодарю.

+0

'if (dict.ContainsValue (value))' или check key 'dict.ContainsKey (value)' – codingbiz

ответ

5

Взгляните на TryGetValue метода словаря

int myInt; 
    if (!_myDictionary.TryGetValue(key, out myInt)) 
    { 
     myInt = 0; 
    } 

Несколько человек предложили использовать ContainsKey. Это не очень хорошая идея, если вы действительно хотите значение, потому что это будет означать два поиска - например.

if (_myDictionary.ContainsKey(key)) // look up 1 
{ 
myInt = _myDictionary[key]; // look up 2 
} 
0

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

+1

Если вы собираетесь вытащить значение независимо, то TryGetValue имеет больше смысла. –

1

Вот пример для вас

using System; 
using System.Collections.Generic; 

class Program 
{ 
static void Main() 
{ 
    Dictionary<string, string> test = new Dictionary<string, string>(); 
    test.Add("one", "value"); 
// 
// Use TryGetValue to avoid KeyNotFoundException. 
// 
string value; 
if (test.TryGetValue("two", out value)) 
{ 
    Console.WriteLine("Found"); 
} 
else 
{ 
    Console.WriteLine("Not found"); 
} 
    } 
} 
1

Прежде всего, с помощью try catch не является хорошей идеей здесь, вы излишне замедляя код, где вы можете легко выполнить, что с ContainsKey или TryGetValue

Я бы предложил решение с TryGetValue, как упомянуто здесь - https://msdn.microsoft.com/en-us/library/kw5aaea4(v=vs.110).aspx (проверьте примеры)

Но вы можете оптимизировать больше. Линия myInt = 0; избыточна, как предположил @Mark. TyGetValue автоматически ставит значение default (0 за int) когда он возвращается.

Если ключ не найден, то параметр значения получает соответствующее значение по умолчанию для типа TValue; например, 0 (ноль) для целых типов, false для типов Boolean и null для ссылочных типов. https://msdn.microsoft.com/en-us/library/bb347013%28v=vs.110%29.aspx

Таким образом, окончательный код может быть

int myInt; 
if (_myDictionary.TryGetValue(key, out myInt)) 
{ 
    [...] //codes that uses the value 
}else{ 
    [...] //codes that does not use the value 
} 

Или -

int myInt; 
_myDictionary.TryGetValue(key, out myInt)) 
[...] //other codes. 

Следующий пункт копируется из документации ВЗ TryGetValue -

Этот метод объединяет функциональность метода ContainsKey и свойства . Если ключ не найден, то параметр значения получает соответствующее значение по умолчанию для типа TValue; например, 0 (ноль) для целых типов, false для булевых типов и null для ссылочных типов. Используйте метод TryGetValue, если ваш код часто пытается получить доступ к ключам, которые не находятся в словаре. Использование этого метода более эффективно, чем улавливание KeyNotFoundException, вызванное по свойству Item. Этот метод приближается к операции O (1).

КСТАТИ, ContainsKey и TryGetValue и имеет время работы O (1). Таким образом, это не имеет большого значения, вы можете использовать любой.

+1

ContainsKey и TryGetValue имеют время работы ~ O (1). но если вы используете первое, а затем используете индексатор, чтобы получить свое значение, тогда у вас есть 2 x O (n). Итак, как я сказал в своем ответе, * если * вы собираетесь использовать значение, TryGetValue является предпочтительным методом. – Mark

+0

TryGetValue не выполняет никакой магии, чтобы получить значения. Он использует оба параметра, как сказано - «Этот метод объединяет функциональность метода ContainsKey и свойства Item». Вы неявно используете оба. BTW, это не 2 x O (n), это O (2n) ~ O (n), где n = 1 –

+0

«Функциональность» не означает эквивалентности. В действительности, TryGetValue использует try/catch вокруг индексатора. Итак, только один поиск. Проверьте отражатель. –

Смежные вопросы