2009-12-21 10 views
35

Jak zmienić wartość wielu kluczy w słowniku.Jak zmodyfikować klucz w słowniku w języku C#

Mam następujący słownik:

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

chcę pętli tej posortowanych słownika i zmienić klucz do klucza + 1, jeżeli wartość klucza jest większa od pewnej kwoty.

+7

Dlaczego ten przegłosowana? – keyboardP

+4

Nie można zmodyfikować klucza. Zamiast tego usuń klucz i dodaj nową wartość dla klucza + 1 –

+1

To pytanie brzmi, jakbyś próbował ręcznie wstawić element i zachować go (w szczególności, robiąc miejsce dla jednego). Zauważ, że SortedDictionary już to robi. – Russell

Odpowiedz

34

Jak powiedział Jason, nie można zmienić klucza istniejącego wpisu słownikowego. Będziesz musiał usunąć/dodać za pomocą nowego klucza tak:

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

Myślę, że możesz napotkać OutOfBoundsException z keyToUpdate +1 –

+0

Dlaczego tak się stało? –

+0

Bardzo dziękuję Dan To jest dokładnie to, czego szukałem .. –

20

Musisz usunąć produkty i dodać je ponownie za pomocą nowego klucza. Za MSDN:

Klucze muszą być niezmienne tak długo, jak są one używane jako klucze w SortedDictionary(TKey, TValue).

1

Jeśli nie przeszkadza odtworzenie słownika, można użyć statment 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); 

lub

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

Nie trzeba tworzyć nowych, aby utworzyć dla niego zmienną. Zobacz mój komentarz – marcel

1

Można użyć LINQ statment bo

var maxValue = 10 
sd= sd.ToDictionary(d => d.key > maxValue ? d.key : d.Key +1, d=> d.Value); 
Powiązane problemy