我需要检查应用程序的某个部分是否发生了变化,因此在加载数据后制作"副本",然后进行比较。比较函数的一部分涉及检查像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);