Лучший способ изменить словарь
Мне интересно, есть ли лучший способ изменить ключ словаря, например:
var dic = new Dictionary<string, int>();
dic.Add("a", 1);
а затем я решил сделать пару ключевых значений ( "b", 1), можно просто переименовать ключ, а не добавить новую пару значений ключа ( "b", 1), а затем удалить "a"?
Спасибо заранее.
Ответы
Ответ 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;
})