web-dev-qa-db-ja.com

C#で辞書のキーを変更する方法

辞書内のいくつかのキーの値を変更するにはどうすればよいですか。

私は次の辞書を持っています:

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

キー値が特定の量よりも大きい場合、このソートされた辞書をループして、キーをkey + 1に変更します。

43

ジェイソンが言ったように、既存の辞書エントリのキーを変更することはできません。次のような新しいキーを使用して、削除/追加する必要があります。

// 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);
}
40
Dan Tao

アイテムを削除して、新しいキーで再度追加する必要があります。 [〜#〜] msdn [〜#〜] ごと:

キーは、SortedDictionary(TKey, TValue)でキーとして使用される限り、不変でなければなりません。

22
jason

LINQステートメントを使用できます

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

辞書の再作成を気にしない場合は、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);
1
goofballLogic