Подтвердить что ты не робот

Лучший способ изменить словарь

Мне интересно, есть ли лучший способ изменить ключ словаря, например:

var dic = new Dictionary<string, int>();
dic.Add("a", 1);

а затем я решил сделать пару ключевых значений ( "b", 1), можно просто переименовать ключ, а не добавить новую пару значений ключа ( "b", 1), а затем удалить "a"?

Спасибо заранее.

4b9b3361

Ответ 1

Нет, вы не можете переименовать ключи, которые были добавлены в словарь. Если вы хотите переименовать объект, возможно, добавьте свой собственный метод расширения:

public static void RenameKey<TKey, TValue>(this IDictionary<TKey, TValue> dic,
                                      TKey fromKey, TKey toKey)
{
  TValue value = dic[fromKey];
  dic.Remove(fromKey);
  dic[toKey] = value;
}

Ответ 2

Dictionary в С# реализуется как хэш-таблица. Поэтому, если вы смогли изменить ключ с помощью некоторого метода Dictionary.ChangeKey, запись должна была бы быть повторно хеширована. Таким образом, это не совсем другое (помимо удобства), чем удаление записи, а затем добавление ее снова с помощью нового ключа.

Ответ 3

public static bool ChangeKey<TKey, TValue>(this IDictionary<TKey, TValue> dict, 
                                           TKey oldKey, TKey newKey)
{
    TValue value;
    if (!dict.TryGetValue(oldKey, out value))
        return false;

    dict.Remove(oldKey);  // do not change order
    dict[newKey] = value;  // or dict.Add(newKey, value) depending on ur comfort
    return true;
}

То же, что и ответ Колина, но не генерирует исключение, а возвращает false при ошибке. На самом деле я придерживаюсь мнения, что такой метод должен быть по умолчанию в классе словаря, учитывая, что редактирование значения ключа опасно, поэтому сам класс должен предоставить нам возможность быть в безопасности.

Ответ 4

Я использую Linq для изменения ключей словаря (восстановление словаря на linq)

Например, я использую следующий код для замены '_' на '-' во всех клавишах только одной командой:

var newDictionary= oldDictionary
                   .Select(x=> new KeyValuePair<string, object>(x.Key.Replace("_", "-"), x.Value))
                   .ToDictionary(x=> x.Key,x=> x.Value);

Магический шаг ToDictionary().


Примечание. Мы можем сделать расширенный Выбрать код блока для сложных случаев вместо простой лямбда.

Select(item =>{
            .....Write your Logic Codes Here....

            return resultKeyValuePair;
       })