2009-12-21 8 views
35

Wie kann ich den Wert einer Anzahl von Schlüsseln in einem Wörterbuch ändern.So ändern Sie Schlüssel in einem Wörterbuch in C#

Ich habe folgendes Wörterbuch:

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

ich durch diese sortierten Wörterbuch Schleifen will und den Schlüssel Schlüssel + 1 ändern, wenn der Schlüsselwert größer als eine bestimmte Menge ist.

+7

Warum wurde diese nach unten gestimmt? – keyboardP

+4

Sie können den Schlüssel nicht ändern. Löschen Sie stattdessen den Schlüssel und fügen Sie einen neuen Wert für Schlüssel + 1 hinzu. –

+1

Diese Frage klingt, als ob Sie versuchen, ein Objekt manuell einzufügen und es sortiert zu halten (insbesondere, um Platz für einen zu schaffen). Beachten Sie, dass SortedDictionary dies bereits für Sie erledigt. – Russell

Antwort

34

Wie Jason sagte, Sie können den Schlüssel eines vorhandenen Wörterbucheintrags nicht ändern. Sie werden entfernen müssen/hinzufügen wie so einen neuen Schlüssel mit:

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

Ich denke, Sie könnten eine OutOfBoundsException mit keyToUpdate +1 –

+0

Warum würde das passieren? –

+0

Vielen Dank Dan Dies ist genau das, was ich gesucht habe .. –

20

Sie müssen die Elemente entfernen und sie mit ihrem neuen Schlüssel erneut hinzufügen. Per MSDN:

Schlüssel müssen so lange unveränderlich sein, wie sie als Schlüssel in den SortedDictionary(TKey, TValue) verwendet werden.

1

Wenn Sie nichts dagegen haben, das Wörterbuch neu zu erstellen, können Sie eine LINQ statment nutzen könnten.

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); 

oder

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

Keine Notwendigkeit, ein neues zu erstellen, um eine Variable dafür zu erstellen. Siehe meinen Kommentar – marcel

1

können Sie LINQ statment verwenden für sie

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