delphi - Spring4D TDistinctIterator.ToArray() 不工作?
问题描述
我想使用TDistinctIterator
Spring4DValues
在TDictionary
. 因此我有以下代码:
var
d: TDictionary<Integer, String>;
v: Vector<String>;
begin
d := TDictionary<Integer, String>.Create();
d.Add(1, 'test');
d.Add(2, 'test');
d.Add(3, 'test');
v := TDistinctIterator<string>.Create(d.Values, nil).ToArray();
end;
但是,这会在ToArray
. 这是一个错误还是我应该以另一种方式使用迭代器来获得相同的结果?
解决方案
您的问题是您使用的是实现类而不是基于接口的方法。重要的是要意识到大部分 spring4d 代码旨在通过接口使用,您通常不应该引用这些接口背后的实现类。
在您的情况下发生的事情是TDistinctIterator<T>
通过引用计数管理生命周期。您的代码没有正确处理生命周期管理,并且TDistinctIterator<String>
实例在您调用之前被销毁ToArray
,从而导致访问冲突。
除了 的问题之外TDistinctIterator<T>
,您的代码也无法正确处理字典的生命周期。
您的代码应如下所示:
var
d: IDictionary<Integer, String>;
v: Vector<String>;
begin
d := TCollections.CreateDictionary<Integer, String>();
d.Add(1, 'test');
d.Add(2, 'test');
d.Add(3, 'test');
v := TEnumerable.Distinct<String>(d.Values).ToArray();
end;
另请注意,以这种方式编写时,您可以从使用列表中删除Spring.Collections.Dictionaries
和删除。Spring.Collections.Extensions
您需要的唯一两个单位是Spring
和Spring.Collections
。
推荐阅读
- android - 如何为 AAR 工件制作等效的“compileOnly”?
- r - 如何使用 for 循环对两个列表进行 seq_along()
- git - 如何解决在 github 上推送新存储库的问题
- tensorflow-federated - TFF:如何在每一轮中模拟用户随机样本的训练
- c# - 从 TempData 转换数据,系统 InvalidCastException
- c - 将具有两个参数的函数传递给一个函数,该函数接受具有一个参数的函数作为 C 中的输入
- java - 从 JPanel 中删除某些名称的 JButton
- javascript - 比较两组在打字稿中是否相同
- google-apps-script - Google 文档中的图像并不总是与文档正文的其余部分一起复制
- hapijs - 错误的 URL 在 Hapijs 中触发无限重定向循环