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