Есть ли простой способ скопировать контент 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 источник в цель. Есть ли такой метод для этого?
Спасибо!
Ответы
Ответ 1
TDictionary имеет конструктор, который позволяет вам передать другой объект коллекции, который создаст новый, скопировав содержимое оригинала. Это то, что вы ищете?
constructor Create(Collection: TEnumerable<TPair<TKey,TValue>>); overload;
Итак, вы использовали бы
Target := TItems.Create(Source);
И Target будет создан как копия источника (или, по крайней мере, содержит все элементы в источнике).
Ответ 2
Если вы хотите пойти еще дальше, здесь другой подход:
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;
в соответствии с вашим определением Key и Значение:
TDictionaryHelpers<TItemKey, TItemData>.CopyDictionary(LSource, LTarget);
Ответ 3
Я думаю, что это должно сделать трюк:
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;