Как назначить / добавить элемент (ы) в словарь, используя индекс ключа? - PullRequest
1 голос
/ 25 июня 2010

Мы хотели назначить / добавить элемент в словарь, используя индекс ключа, например:

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

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

Есть ли способ присвоить значения этому словарю так же, как я присваиваю значения сеансам, используя null coalesce:

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

Спасибо

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

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

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

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

Ответы [ 2 ]

1 голос
/ 25 июня 2010

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

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 голос
/ 25 июня 2010

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

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

Edit:

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

...