2011-06-27 30 views
21

tôi tự hỏi là có cách nào tốt hơn để thay đổi một chìa khóa từ điển, ví dụ:Cách tốt nhất để thay đổi từ điển chính

var dic = new Dictionary<string, int>(); 
dic.Add("a", 1); 

và sau đó tôi quyết định làm cho cặp giá trị key được ("b", 1), có thể chỉ đổi tên khóa thay vì thêm cặp giá trị khóa mới ("b", 1) và sau đó xóa "a"?

Xin cảm ơn trước.

Trả lời

48

Không, bạn không thể đổi tên khóa khi đã được thêm vào từ điển. Nếu bạn muốn có một cơ sở đổi tên, có lẽ thêm phương pháp khuyến nông của riêng bạn:

public static void RenameKey<TKey, TValue>(this IDictionary<TKey, TValue> dic, 
             TKey fromKey, TKey toKey) 
{ 
    TValue value = dic[fromKey]; 
    dic.Remove(fromKey); 
    dic[toKey] = value; 
} 
+4

Một đặt tên tốt hơn là 'ChangeKey' hoặc 'UpdateKey' :) – nawfal

15

Các Dictionary trong C# được thực hiện như một Hashtable. Do đó, nếu bạn có thể thay đổi khóa qua một số phương pháp Dictionary.ChangeKey, mục nhập sẽ phải được băm lại. Vì vậy, nó không thực sự bất kỳ khác nhau (ngoài thuận tiện) hơn loại bỏ các mục, và sau đó thêm nó một lần nữa với khóa mới.

+2

1 cho biết lý do tại sao nó không khác gì so với những gì anh ấy làm gì bây giờ – TruthOf42

5
public static bool ChangeKey<TKey, TValue>(this IDictionary<TKey, TValue> dict, 
              TKey oldKey, TKey newKey) 
{ 
    TValue value; 
    if (!dict.TryGetValue(oldKey, out value)) 
     return false; 

    dict.Remove(oldKey); // do not change order 
    dict[newKey] = value; // or dict.Add(newKey, value) depending on ur comfort 
    return true; 
} 

Giống như câu trả lời của Colin, nhưng không ném ngoại lệ, thay vào đó trả về false về lỗi. Trong thực tế, tôi có ý kiến ​​rằng một phương thức như vậy nên được mặc định trong lớp từ điển xem xét việc chỉnh sửa giá trị khóa là nguy hiểm, vì vậy bản thân lớp nên cung cấp cho chúng ta một tùy chọn để an toàn.

2

tôi sử dụng LINQ để thay đổi các phím từ điển của tôi (tái sinh một cuốn từ điển bằng cách linq)

Ví dụ tôi sử dụng đoạn mã sau để thay thế '_' với '-' trong tất cả các phím chỉ bằng một lệnh:

var newDictionary= oldDictionary 
        .Select(x=> new KeyValuePair<string, object>(x.Key.Replace("_", "-"), x.Value)) 
        .ToDictionary(x=> x.Key,x=> x.Value); 

Bước ma thuật là ToDictionary().


Lưu ý: Chúng tôi có thể làm cho một tiên tiến Chọn bao gồm một khối mã đối với trường hợp phức tạp thay vì một lambda đơn giản.

Select(item =>{ 
      .....Write your Logic Codes Here.... 

      return resultKeyValuePair; 
     }) 
Các vấn đề liên quan