Как правильно скопировать словарь? - PullRequest
2 голосов
/ 22 апреля 2020

Мне нужно проверить, произошли ли изменения в определенной части приложения, и поэтому я делаю «копии» данных после их загрузки, а затем сравниваю их. Одна часть функции сравнения включает проверку ключей в таких словарях, как lDict1.Keys.EqualsTo(lDict2.Keys).

. Хотя словари не зависят от порядка элементов, я не осознавал, что даже если я заполню два словаря одинаковыми данные, они не будут созданы одинаково, и порядок элементов может измениться, поэтому предыдущая функция не работает должным образом, так как она опирается на порядок элементов, который может не совпадать при использовании любого из следующих методов. (Я не уверен, почему)

var
  lDict1, lDict2 : IDictionary<Integer, TObject>;
  lKey : Integer;
begin
  lDict1 := TCollections.CreateDictionary<Integer, TObject>;
  lDict1.Add(5, nil); // Keys.First = 5, Keys.Last = 5
  lDict1.Add(6, nil); // Keys.First = 5, Keys.Last = 6
  lDict2 := TCollections.CreateDictionary<Integer, TObject>;
  lDict2.AddRange(lDict1); // Keys.First = 6, Keys.Last = 5
  lDict2.Clear;
  for lKey in lDict1.Keys do // Keys.First = 6, Keys.Last = 5
    lDict2.Add(lKey, nil);
end;

Есть ли способ сделать точную копию словаря, чтобы я мог сравнить их? Один из способов обойти эту проблему - создать собственную функцию сравнения, но я бы хотел этого избежать.

function ContainsSameValues<T>(AEnumerable1, AEnumerable2: IEnumerable<T>): Boolean;
var
  lValue : T;
begin
  Result := AEnumerable1.Count = AEnumerable2.Count;
  if Result then
  begin
    for lValue in AEnumerable1 do
    begin
      Result := AEnumerable2.Contains(lValue);
      if not Result then
        Exit;
    end;
  end;
end;

использование

ContainsSameValues<Integer>(lDict1.Keys, lDict2.Keys);

1 Ответ

3 голосов
/ 22 апреля 2020

Проверка на равенство неупорядоченных словарей является относительно простым алгоритмом. Я обрисую это здесь. Предположим, у нас есть два словаря, A и B.

  1. Сравните количество элементов A и B. Если это не так, словари не равны.
  2. Перечислите каждый ключ / значение пара k, v в A. Если k не в B или B [k] не равно v, то словари не равны.
  3. Если вы достигли конца перечисления, то вы знаете, что словари равны.
...