gpt4 book ai didi

delphi - 抄字典的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 01:28:57 24 4
gpt4 key购买 nike

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

最佳答案

检查无序字典的相等性是一种相对简单的算法。我将在这里概述。假设我们有两个字典,A 和 B。

  1. 比较 A 和 B 的元素个数。如果不同,则字典不相等。
  2. 枚举A中的每个键/值对k,v。如果k不在B中,或者B[k]不等于v,则字典不相等。
  3. 如果你到达枚举的末尾,那么你就知道字典是相等的。

关于delphi - 抄字典的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61364886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com