Подтвердить что ты не робот

Есть ли простой способ скопировать контент 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 источник в цель. Есть ли такой метод для этого?

Спасибо!

4b9b3361

Ответ 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;