Как изменить ключ в словаре в C #

c# .net dictionary key

71269 просмотра

4 ответа

521 Репутация автора

Как я могу изменить значение количества ключей в словаре.

У меня есть следующий словарь:

SortedDictionary<int,SortedDictionary<string,List<string>>>

Я хочу перебрать этот отсортированный словарь и изменить ключ на ключ + 1, если значение ключа больше определенной величины.

Автор: Bernard Larouche Источник Размещён: 21.12.2009 02:17

Ответы (4)


22 плюса

203541 Репутация автора

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

Ключи должны быть неизменяемыми, если они используются в качестве ключей в SortedDictionary(TKey, TValue).

Автор: jason Размещён: 21.12.2009 02:19

41 плюса

98702 Репутация автора

Решение

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

// we need to cache the keys to update since we can't
// modify the collection during enumeration
var keysToUpdate = new List<int>();

foreach (var entry in dict)
{
    if (entry.Key < MinKeyValue)
    {
        keysToUpdate.Add(entry.Key);
    }
}

foreach (int keyToUpdate in keysToUpdate)
{
    SortedDictionary<string, List<string>> value = dict[keyToUpdate];

    int newKey = keyToUpdate + 1;

    // increment the key until arriving at one that doesn't already exist
    while (dict.ContainsKey(newKey))
    {
        newKey++;
    }

    dict.Remove(keyToUpdate);
    dict.Add(newKey, value);
}
Автор: Dan Tao Размещён: 21.12.2009 02:33

1 плюс

22248 Репутация автора

Если вы не возражаете воссоздать словарь, вы можете использовать LINQ-оценку.

var dictionary = new SortedDictionary<int, SortedDictionary<string, List<string>>>();
var insertAt = 10;
var newValues = dictionary.ToDictionary(
    x => x.Key < insertAt ? x.Key : x.Key + 1,
    x => x.Value);
return new SortedDictionary<int, SortedDictionary<string, List<string>>>(newValues); 

или же

var dictionary = new SortedDictionary<int, SortedDictionary<string, List<string>>>();
var insertAt = 10;
var newValues = dictionary.ToDictionary(
    x => x.Key < insertAt ? x.Key : x.Key + 1,
    x => x.Value);
dictionary.Clear();
foreach(var item in newValues) dictionary.Add(item.Key, item.Value);
Автор: goofballLogic Размещён: 22.01.2014 10:44

2 плюса

277 Репутация автора

Вы можете использовать LINQ для этого

var maxValue = 10
sd= sd.ToDictionary(d => d.key > maxValue ? d.key : d.Key +1, d=> d.Value);
Автор: marcel Размещён: 13.09.2015 05:44
32x32