2013-04-24 2 views
0

Я использовал TryGetValue для добавления/замены данных в моих словарях. Чтобы сделать различие между добавлением новых и заменой старых, я использую как [], так и .Add(). Это приводит к коду, как это, если я на самом деле не делать ничего с извлеченным значением:Должен ли я всегда использовать Dictionary.TryGetValue, даже если я все хочу сделать, это добавить/заменить значения?

private Dictionary<Foo, Bar> dictionary = new Dictionary<Foo, Bar>(); 

public void Update(Foo foo) 
{ 
    Bar bar; 
    if (dictionary.TryGetValue(foo, out bar) 
    { 
     dictionary [foo] = bar; 
    } 
    else 
    { 
     dictionary .Add(foo, bar); 
    } 
} 

Если я на самом деле не делать ничего с извлеченным значением, есть причина, почему я не должен заменить выше код с этим ?:

public void Update(Foo foo) 
{ 
    dictionary[foo] = bar; 
} 

Благодарим вас заблаговременно.

+0

_ «Есть ли причина, по которой я не должен заменять вышеуказанный код этим?» _ ** Нет ** (кроме того, что 'bar' не объявлен и не инициализирован) –

+1

Просто не делайте этого обратное с ожиданием получения нулевого для отсутствующих ключей: 'var item = dictionary [foo]', поскольку это вызовет исключение, если ключ не существует (в отличие от «Hashtable»). –

+0

Что такое 'bar' во втором методе' Update (Foo foo) '? –

ответ

5

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

Что еще более важно, это проще.

+1

Но семантика не то же самое (возможно 'KeyNotFoundException') –

+2

@lukas Семантика такая же, как и образец альтернативного кода, который также не бросает« KeyNotFoundException », поэтому в этом случае более простой код достигает точно такой же , –

+1

@lukas: Ни один фрагмент не может вызывать «KeyNotFoundException». –

4

Нет, нет причин не использовать более короткий код.
Фактически, вы действительно должны использовать его, поскольку он намного проще, и все мы знаем:
Упрощенный код означает меньше ошибок.

+0

Вы считаете, что это значение существует в коллекции, а что нет, если нет? Если try .. удален из метода, все логические изменения изменены, потому что метод не просто обновляется, но также проверяет, существует ли ключ. – Marco

+0

@Marco Установитель на индексе добавляет ключ и значение, если оно отсутствует, или обновляет значение, если ключ существует. –

+0

@Marco: Пожалуйста, перейдите и прочитайте [документацию] (http://msdn.microsoft.com/en-us/library/9tee9ht2.aspx). Важная часть такова: «Если указанный ключ не найден, [...] операция set создает новый элемент с указанным ключом». –

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