delphi - 复制字典的正确方法是什么?
问题描述
我需要检查应用程序的某个部分是否发生了变化,因此我在加载数据后对数据进行“复制”,然后进行比较。比较功能的一部分涉及检查字典中的键,例如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。
- 比较 A 和 B 的元素数量。如果不同,则字典不相等。
- 枚举 A 中的每个键/值对 k,v。如果 k 不在 B 中,或者 B[k] 不等于 v,则字典不相等。
- 如果您到达枚举的末尾,那么您知道字典是相等的。
推荐阅读
- java - 如何检查应用程序是否在较低的 Android 上具有 ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION 和其他存储权限
- android - 当我的焦点位于 Android TV 应用程序中的自定义键盘键上时,如何在 EditText 上显示静态光标
- javascript - 使用 Office.js API 获取电子邮件标头(原始)
- javascript - 多个元素的动态Javascript代码
- mongodb - 如何根据client.cer和CA_Intermediate.txt创建keystore,jks和trustore,jks连接MongoDB数据库
- spring-integration - 动态集成流注册导致性能下降
- scala - 具有未知循环数的 Scala 未来
- javascript - 通过 google-closure-compiler jar 更改输出语言规范时出现“ReferenceError: $jscomp is not defined”
- python - 使用python从多个文本文件中提取特定数据到excel文件
- python - 一个函数接受 1 个位置参数,但给出了 133 个