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



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



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


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



Заранее благодарю.

779   4  

4 ответов:

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

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;
}

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

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 при сбое. На самом деле я придерживаюсь мнения, что такой метод должен быть по умолчанию в классе dictionary, учитывая, что редактирование значения ключа опасно, поэтому сам класс должен дать нам возможность быть в безопасности.

Нравится ли вам этот простой код?

var newDictionary= oldDictionary.ReplaceInKeys<object>("_","-");

Он заменяет '_' на '-' во всех ключах


Если

  • тип Вашего key это string

И

  • Вы хотите заменить строку на другую строку во всех ключах словаря

Тогда используй мой путь


Вам просто нужно добавить следующий класс в свой приложение:

public static class DicExtensions{

    public static void ReplaceInKeys<TValue>(this IDictionary<string, TValue> oldDictionary, string replaceIt, string withIt)
    {
          // Do all the works with just one line of code:
          return oldDictionary
                 .Select(x=> new KeyValuePair<string, TValue>(x.Key.Replace(replaceIt, withIt), x.Value))
                 .ToDictionary(x=> x.Key,x=> x.Value);
    }
}

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

Волшебный шаг-это ToDictionary() метод.


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

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

            return resultKeyValuePair;
       })

Comments

    Ничего не найдено.