Есть ли более элегантный способ добавления предмета в словарь <> безопасно?
Мне нужно добавить пары ключ/объект в словарь, но мне, конечно, нужно сначала проверить, существует ли ключ, иначе я получаю сообщение " уже существует в словаре". Код ниже решает это, но неуклюже.
Что представляет собой более элегантный способ сделать это, не используя метод вспомогательной строки?
using System;
using System.Collections.Generic;
namespace TestDictStringObject
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, object> currentViews = new Dictionary<string, object>();
StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view1");
StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view2");
StringHelpers.SafeDictionaryAdd(currentViews, "Employees", "view1");
StringHelpers.SafeDictionaryAdd(currentViews, "Reports", "view1");
foreach (KeyValuePair<string, object> pair in currentViews)
{
Console.WriteLine("{0} {1}", pair.Key, pair.Value);
}
Console.ReadLine();
}
}
public static class StringHelpers
{
public static void SafeDictionaryAdd(Dictionary<string, object> dict, string key, object view)
{
if (!dict.ContainsKey(key))
{
dict.Add(key, view);
}
else
{
dict[key] = view;
}
}
}
}
Ответы
Ответ 1
Просто используйте indexer - он перезапишет, если он уже существует, но он не обязательно должен быть первым:
Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";
В основном используйте Add
, если наличие ключа указывает на ошибку (так что вы хотите ее бросить) и в противном случае указатель. (Это немного похоже на разницу между литьем и использованием as
для ссылочных преобразований.)
Если вы используете С# 3, и у вас есть отличный набор ключей, вы можете сделать это даже более аккуратным:
var currentViews = new Dictionary<string, object>()
{
{ "Customers", "view2" },
{ "Employees", "view1" },
{ "Reports", "view1" },
};
В вашем случае это не сработает, поскольку инициализаторы коллекции всегда используют Add
, который будет вызывать вторую запись Customers
.
Ответ 2
Что случилось с...
dict[key] = view;
Он автоматически добавит ключ, если он не существует.
Ответ 3
просто
dict[key] = view;
Из документации MSDN Dictionary.Item
Значение, связанное с указанный ключ. Если указанный ключ не найден, операция получения KeyNotFoundException и набор операция создает новый элемент с указанный ключ.
Мой акцент
Ответ 4
Как обычно, Джон Скит попадает туда со скоростью освещения с правильным ответом, но интересно, что вы также могли бы написать свой SafeAdd как метод расширения в IDictionary.
public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...
Ответ 5
Хотя использование индексатора, безусловно, является правильным ответом для вашей конкретной проблемы, другой более общий ответ на вопрос о добавлении дополнительных функций к существующему типу будет заключаться в определении метода расширения.
Очевидно, что это не особенно полезный пример, а что-то, что нужно помнить в следующий раз, когда вы найдете настоящую потребность:
public static class DictionaryExtensions
{
public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict,
TKey key, TValue value)
{
dict[key] = value;
}
}