2012-03-20 51 views
12

如何將一個TDictionary內容複製到另一個方法中有單一方法還是簡單方法? 比方說,我有以下聲明有沒有簡單的方法將TDictionary內容複製到另一個?

type 
    TItemKey = record 
    ItemID: Integer; 
    ItemType: Integer; 
    end; 
    TItemData = record 
    Name: string; 
    Surname: string; 
    end; 
    TItems = TDictionary<TItemKey, TItemData>; 

var 
    // the Source and Target have the same types 
    Source, Target: TItems; 
begin 
    // I can't find the way how to copy source to target 
end; 

,我想複製1:1的源到目標。有這樣的方法嗎?

謝謝!

回答

21

TDictionary有一個構造函數,可以讓你在另一個集合對象,這將通過複製原始的內容創建新的一個通過。那是你在找什麼?

constructor Create(Collection: TEnumerable<TPair<TKey,TValue>>); overload; 

,因此會使用

Target := TItems.Create(Source); 

和目標將被創建爲源代碼的副本(或至少包含在源中的所有項目)。

+3

+1我使用泛型TDictionary相當多,但不知道這一點。謝謝。 – Justmade 2012-03-20 13:43:23

+2

也從我+1,不知道這個超載,我現在很生氣! -.- – ComputerSaysNo 2012-03-20 13:47:08

0

我想這應該做的伎倆:

var 
    LSource, LTarget: TItems; 
    LKey: TItemKey; 
begin 
    LSource := TItems.Create; 
    LTarget := TItems.Create; 
    try 
    for LKey in LSource.Keys do 
     LTarget.Add(LKey, LSource.Items[ LKey ]); 
    finally 
    LSource.Free; 
    LTarget.Free; 
    end; // tryf 
end; 
+0

你能解釋爲什麼你分配LNewKey := LKey;而不是僅在表達式LTarget.Add(LKey,LSource.Items [LKey])中使用兩次Lkey; – RobertFrank 2012-03-20 13:21:51

+0

@羅伯特,是的,這是從一些測試遺留下來的,謝謝,我會刪除它... – ComputerSaysNo 2012-03-20 13:27:00

1

如果你想走得更遠,這裏的另一種方法:根據您的重點價值定義

type 
    TDictionaryHelpers<TKey, TValue> = class 
    public 
    class procedure CopyDictionary(ASource, ATarget: TDictionary<TKey,TValue>); 
    end; 

...implementation... 

{ TDictionaryHelpers<TKey, TValue> } 

class procedure TDictionaryHelpers<TKey, TValue>.CopyDictionary(ASource, 
    ATarget: TDictionary<TKey, TValue>); 
var 
    LKey: TKey; 
begin 
    for LKey in ASource.Keys do 
    ATarget.Add(LKey, ASource.Items[ LKey ]); 
end; 

用法:

TDictionaryHelpers<TItemKey, TItemData>.CopyDictionary(LSource, LTarget); 
相關問題