复制字典的正确方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制字典的正确方法是什么?相关的知识,希望对你有一定的参考价值。
我需要检查应用程序的某个部分是否发生了变化,因此我在加载数据后对它们进行 "复制",然后进行比较。比较功能的一部分涉及检查字典中的键,如 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,那么字典就不相等。
- 如果你到达了枚举的终点,那么你就知道字典是相等的。
以上是关于复制字典的正确方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章
什么是在 C++ 中获取总内核数量的跨平台代码片段? [复制]