Есть ли более элегантный способ безопасного добавления элемента в словарь <>?

127
задан Edward Tanguay 24 July 2009 в 13:07
поделиться

5 ответов

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

Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";

Обычно используется Добавить , если наличие ключа указывает на ошибку (поэтому вы хотите, чтобы он выбросил), и индексатор в противном случае. (Это немного похоже на разницу между приведением типов и использованием как для преобразований ссылок.)

Если вы используете C # 3 и у вас есть отдельный набор ключей , вы можете сделайте это еще аккуратнее:

var currentViews = new Dictionary<string, object>()
{
    { "Customers", "view2" },
    { "Employees", "view1" },
    { "Reports", "view1" },
};

Это не сработает в вашем случае, так как инициализаторы коллекций всегда используют Add , который бросит вторую запись Customers .

232
ответ дан 24 November 2019 в 00:21
поделиться

What's wrong with...

dict[key] = view;

It'll automatically add the key if it's non-existent.

46
ответ дан 24 November 2019 в 00:21
поделиться

просто

dict[key] = view;

Из документации MSDN Dictionary.Item

Значение, связанное с указанный ключ. Если указанный ключ не найден, операция get вызывает KeyNotFoundException и набор операция создает новый элемент с указанный ключ .

Мое выделение

21
ответ дан 24 November 2019 в 00:21
поделиться

Хотя использование индексатора, безусловно, является правильным решением вашей конкретной проблемы, это еще один более общий ответ на проблему добавления дополнительных функций к существующему типу означало бы определить метод расширения.

Очевидно, что это не особо полезный пример, но о чем следует помнить в следующий раз, когда вы обнаружите реальную потребность:

public static class DictionaryExtensions
{
    public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, 
                                             TKey key, TValue value)
    {
        dict[key] = value;
    }
}
7
ответ дан 24 November 2019 в 00:21
поделиться

Как обычно, Джон Скит добирается туда со скоростью молнии с правильным ответом, но, что интересно, вы также могли бы написать SafeAdd как метод расширения в IDictionary.

public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...
10
ответ дан 24 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: