2009-12-21 4 views
35

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

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

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

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

+7

Почему это отвергнуто? – keyboardP

+4

Вы не можете изменить ключ. Вместо этого удалите ключ и добавьте новое значение для клавиши + 1 –

+1

Этот вопрос звучит так, как будто вы пытаетесь вручную вставить элемент и сохранить его сортировку (в частности, место для одного). Обратите внимание, что SortedDictionary делает это за вас уже. – Russell

ответ

34

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

// 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); 
} 
+0

Я думаю, вы можете столкнуться с OutOfBoundsException с keyToUpdate +1 – 2009-12-21 02:39:44

+0

Зачем это случилось? –

+0

Большое спасибо Dan Это именно то, что я искал .. –

20

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

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

1

Если вы не возражаете, воссоздавая словарь, вы можете использовать Постулаты 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); 
+0

Не нужно создавать новое, чтобы создать для него переменную. Просмотреть мой комментарий – marcel

1

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

var maxValue = 10 
sd= sd.ToDictionary(d => d.key > maxValue ? d.key : d.Key +1, d=> d.Value); 
Смежные вопросы