2009-12-21 33 views
35

Làm cách nào để thay đổi giá trị của một số khóa trong từ điển.Cách sửa đổi khóa trong từ điển trong C#

Tôi có từ điển sau:

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

Tôi muốn lặp qua từ điển được sắp xếp này và thay đổi chìa khóa để chìa khóa + 1 nếu giá trị quan trọng là lớn hơn một số tiền nhất định.

+7

Tại sao này bình chọn xuống? – keyboardP

+4

Bạn không thể sửa đổi khóa. Thay vào đó, hãy xóa khóa và thêm một giá trị mới cho khóa + 1 –

+1

Câu hỏi này có vẻ như bạn đang cố gắng chèn một mục theo cách thủ công và giữ cho nó được sắp xếp (cụ thể, tạo khoảng trống cho một mục). Lưu ý SortedDictionary thực hiện điều này cho bạn. – Russell

Trả lời

34

Như Jason đã nói, bạn không thể thay đổi khóa của mục nhập từ điển hiện có. Bạn sẽ phải xóa/thêm sử dụng một chìa khóa mới như vậy:

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

Tôi nghĩ bạn có thể gặp phải một lỗi OutOfBoundsException với keyToUpdate +1 –

+0

Tại sao điều đó lại xảy ra? –

+0

Cảm ơn bạn rất nhiều Dan Đây chính xác là những gì tôi đang tìm kiếm .. –

20

Bạn cần xóa các mục và thêm lại chúng bằng khóa mới của chúng. Per MSDN:

Khóa phải không thay đổi miễn là chúng được sử dụng làm khóa trong SortedDictionary(TKey, TValue).

1

Nếu bạn không nhớ tái tạo lại từ điển, bạn có thể sử dụng một 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); 

hoặc

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

Không cần tạo mới để tạo biến cho nó. Xem nhận xét của tôi – marcel

1

Bạn có thể sử dụng LINQ Statment cho nó

var maxValue = 10 
sd= sd.ToDictionary(d => d.key > maxValue ? d.key : d.Key +1, d=> d.Value); 
Các vấn đề liên quan