Мне нужно проверить, произошли ли изменения в определенной части приложения, и поэтому я делаю «копии» данных после их загрузки, а затем сравниваю их. Одна часть функции сравнения включает проверку ключей в таких словарях, как 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);