Есть ли простой способ скопировать содержимое 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;