2009-12-21 121 views
35

¿Cómo puedo cambiar el valor de varias teclas en un diccionario?Cómo modificar la clave en un diccionario en C#

Tengo el siguiente diccionario:

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

quiero colocar a través de este diccionario ordenada y cambiar la clave de tecla + 1 si el valor de la clave es mayor que una cierta cantidad.

+7

¿Por qué se rechazó? – keyboardP

+4

No puede modificar la clave. En su lugar, elimine la clave y agregue un nuevo valor para la clave + 1 –

+1

. Esta pregunta parece que está intentando insertar manualmente un elemento y mantenerlo ordenado (específicamente, dejando espacio para uno). Tenga en cuenta que SortedDictionary ya lo hace por usted. – Russell

Respuesta

34

Como dijo Jason, no puede cambiar la clave de una entrada de diccionario existente. Vas a tener que quitar/añadir usando una nueva clave de este modo:

// 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

Creo que puede encontrar una OutOfBoundsException con keyToUpdate +1 –

+0

¿Por qué sucedería eso? –

+0

Muchas gracias Dan Esto es exactamente lo que estaba buscando .. –

20

Debe quitar los elementos y volver a agregarlos con su nueva clave. Por MSDN:

teclas deben de ser inmutable, siempre y cuando se utilizan como claves en el SortedDictionary(TKey, TValue).

1

Si no le importa volver a crear el diccionario, se puede utilizar un DECLARACIÓN 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); 

o

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

No es necesario crear uno nuevo para crear una variable para él. Ver mi comentario – marcel

1

Puede utilizar LINQ DECLARACIÓN para ello

var maxValue = 10 
sd= sd.ToDictionary(d => d.key > maxValue ? d.key : d.Key +1, d=> d.Value); 
Cuestiones relacionadas