Как присвоить/добавить объект (объекты) Словарю с помощью ключевого индекса?

Мы хотели присвоить/добавить объект Словарю с помощью ключевого индекса, как это:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["key"] = dict["key"] ?? "object";

Но это заканчивается к: "Данный ключ не присутствовал в словаре".

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

Session["Member"] = Session["Member"] ?? new Member();

Спасибо

Править: Я на самом деле пытался переопределить индексатор от дочернего класса словаря, но напрасно. Интерфейс Implementing IDictionary казался бы слишком много, потому что нам просто нужна функциональность кода ниже (т.е. пустой указатель возврата, если ключ не найден). Таким образом, я думаю, возможно, мы могли использовать расширения как:

public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
    get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
    set { thisDictionary[key] = value; }
}

но это не работает или даже компилирует.

Какие-либо другие более простые пути, таким образом, мы могли снова использовать эту функциональность индексатора?Большое спасибо.

1
задан Jronny 30 June 2010 в 08:25
поделиться

2 ответа

Если вы хотите сделать это встроенным:

dict["key"] = dict.ContainsKey("key") ? (dict["key"] ?? "object") : "object"; 

Альтернативно:

dict["key"] = dict.ContainsKey("key") && dict["key"] == null ? dict["key"] : "object";

Редактировать согласно комментариям:

public static TValue GetSafe(this Dictionary<TKey, TValue> thisDictionary, TKey key) 
{ 
   if (!thisDictionary.ContainsKey(key))
       thisDictionary[key] = null;

   return thisDictionary[key];
}

Это позволяет вам сделать это:

thisDictionary["randomKey"] = thisDictionary.GetSafe("randomKey") ?? "someValue";
1
ответ дан 2 September 2019 в 23:31
поделиться

Как вы заметили, попытка получить отсутствующий ключ вызывает исключение. Вы должны сначала проверить, существует ли ключ:

if( !Session.ContainsKey("Member") )
    Session["Member"] = new Member();

Изменить:

И ответить на ваш вопрос; вы можете создать свой собственный индексатор или реализовать интерфейс IDictionary. Таким образом, вы можете избежать стандартного поведения, вызывающего исключение

1
ответ дан 2 September 2019 в 23:31
поделиться
Другие вопросы по тегам:

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