首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring4D TDistinctIterator<string>.ToArray()不工作?

Spring4D TDistinctIterator<string>.ToArray()不工作?
EN

Stack Overflow用户
提问于 2021-06-21 18:15:20
回答 1查看 79关注 0票数 2

我想使用Spring4D TDistinctIteratorTDictionary中获取不同的Values。因此,我有以下代码:

代码语言:javascript
复制
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中产生访问冲突。这是一个bug吗?或者我应该以另一种方式使用迭代器来获得相同的结果?

EN

回答 1

Stack Overflow用户

发布于 2021-06-21 18:35:20

您的问题是您使用的是实现类,而不是基于接口的方法。重要的是要认识到,大部分spring4d代码都是通过接口使用的,您通常不应该引用这些接口背后的实现类。

在您的例子中,TDistinctIterator<T>的生命周期是通过引用计数来管理的。您的代码没有正确地处理该生存期管理,并且在您调用ToArray之前TDistinctIterator<String>实例已被销毁,从而导致访问冲突。

除了TDistinctIterator<T>的问题之外,您的代码也不能正确处理字典的生命周期。

您的代码应如下所示:

代码语言:javascript
复制
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.DictionariesSpring.Collections.Extensions。您只需要两个单元:SpringSpring.Collections

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68066099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档