2013-04-27 60 views
4

目前,我有比這一個(間接更新)沒有其他辦法:有什麼方法可以直接在.NET中更新字典的Key元素?

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){ 
    if(dict.ContainsKey(oldKey)){ 
      object value = dict[oldKey]; 
      dict.Remove(oldKey); 
      dict.Add(newKey,value); 
    } 
} 

你有別的更好的辦法?

當然,上面的方法只是一個簡單的方法,爲了使其工作得很好而不會引發任何異常,我們必須檢查newKey是否與Dictionary中已有的鍵重複。像這樣:

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){ 
    if(dict.ContainsKey(oldKey)){ 
      object value = dict[oldKey]; 
      dict.Remove(oldKey);    
      dict[newKey] = value; 
    } 
} 

非常感謝您提前!

+3

刪除和重新添加是唯一的方法。密鑰用作值的標識,因此密鑰更改的邏輯上不可能;這意味着關鍵是指一個不同的實體。 '字典'堅持這個觀點。 – 2013-04-27 18:10:49

+2

如果你必須做很多事情,最好使用另一種數據結構。 – 2013-04-27 18:11:56

+2

你爲什麼需要這個? – 2013-04-27 18:14:46

回答

10

我會用TryGetValue方法而不是Contains

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){ 
    object value; 
    if(dict.TryGetValue(oldKey, out value)){ 
      dict.Remove(oldKey); 
      dict.Add(newKey, value); 
    } 
} 

但你仍然需要先獲得價值,與其他鍵添加並刪除舊的。你不能以其他方式做。

順便說一句:你可以使通用的方法來更多的則只是一個字典類型進行操作:

private static void UpdateKey<TKye, TValue>(Dictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){ 
    TValue value; 
    if(dict.TryGetValue(oldKey, out value)){ 
      dict.Remove(oldKey); 
      dict.Add(newKey, value); 
    } 
} 

或者你可以將事件寫IDictionary<TKey, TValue>自己的擴展方法:

public static class DictionaryExtensions 
{ 
    public static void UpdateKey<TKye, TValue>(this IDictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){ 
     TValue value; 
     if(dict.TryGetValue(oldKey, out value)){ 
       dict.Remove(oldKey); 
       dict.Add(newKey, value); 
     } 
    } 
} 

然後稱之爲標準Dictionary方法:

myDict.UpdateKey(oldKey, newKey); 
+0

謝謝,我的代碼僅僅是爲了說明的目的。我喜歡你的TryGetValue方法。謝謝! – 2013-04-27 18:14:54

2

沒有這樣的選項,因爲更改密鑰不是簡單的替換,而是可能需要重建內部字典結構的複雜操作。

如果字典有這樣的方法,它會做同樣的 - 刪除和添加。

爲了簡化你的代碼,你可以創建一個擴展方法來做到這一點。

2

簡而言之,沒有。你必須刪除並重新添加它。如果有內置的方法來做到這一點,它必須做同樣的事情。

想想你在問什麼,你會明白爲什麼刪除和添加是必須完成的邏輯方式。想想如何在引擎蓋下實現字典。換一把鑰匙意味着什麼?

首先字典保持條目的結構。由於每個條目都是一個結構,因此它是鍵入的值,因此無法在適當位置進行更新。當然,一個Entry可以表示爲一個對象而不是結構體,但是他爲此目的會是什麼?如果處理數據的確是邊緣情況,那將是一種效率較低的方法。

第二個在基本級別的字典將散列值映射到項目。由於存在有限數量的哈希,實際上使用桶以更復雜的方式映射了哈希。這意味着你不能只是簡單地改變值(即使底層結構允許我們這樣做)。你在這種情況下基本上必須做的是刪除鍵和映射,然後將它們添加回來。在這種情況下,代碼正在做你寫的東西。

一般而言,鍵應該是關於價值的東西,因爲這種困難,它不會精確地改變,所以沒有內建的方法去做你寫的東西(認爲它可以做得比你寫的更清晰),但是無論在何處或如何實施,基本操作必須是刪除和添加。

查看source code可查看字典實際工作原理的詳細信息,以便更深入地理解。

+0

非常感謝(+1):) – 2013-04-27 18:38:12

相關問題