2011-04-08 25 views
8

我可以更改TDictionary中的密鑰,而不更改該值嗎?如何更改Delphi TDictionary或TObjectDictionary中的鍵值?

爲了解釋,我使用了TObjectDictionary,它是從Delphi XE Generics.Collections單元中的TDictionary派生的。這一切都很好,除了我還需要能夠更改存儲對象的鍵值。

我第一次嘗試如下:

MyObject := MyDictionary.Items[OldKeyValue]; 
MyDictionary.Remove(OldKeyValue); 
MyDictionary.Add(NewKeyValue, MyObject); 

這種方法的問題是,刪除()使對象是Free'd。我試着做一個AddOrSetValue,先將值改爲零,但Free也是這個對象。既然我已經告訴它擁有它們的字典,這就夠公平了。 TObjectDictonary中沒有額外的功能可以在沒有Free的情況下移除,因此我將嘗試在不改變值的情況下更改字典中的Key。但是我無法看到任何看起來像在Delphi XE幫助中會做到的事情。這可能嗎?如果不是的話,我會回去使用一個字典,並自己釋放它。

回答

18

撥打電話TDictionary<TKey,TValue>.ExtractPair(const Key: TKey)您將獲得按鍵和值,但該值不會被釋放。然後您可以使用不同的密鑰重新添加它。

ExtractPair()方法返回一個TPair<TKey,TValue>,它只是一個包含關鍵字及其關聯值的記錄。

的代碼可能是這個樣子:

type 
    TMyKey = string; 
    TMyValue = TMyObject; 

procedure ChangeKey(dict: TDictionary<TMyKey,TMyValue>; OldKey, NewKey: TMyKey); 
var 
    Pair: TPair<TMyKey,TMyValue>; 
begin 
    Pair := dict.ExtractPair(OldKey); 
    dict.Add(NewKey, Pair.Value); 
end; 
+2

方法ExtractPair()德爾福2009年不存在。 – Wodzu 2012-11-29 11:55:05