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