首页 > 解决方案 > Spring4D TDistinctIterator.ToArray() 不工作?

问题描述

我想使用TDistinctIteratorSpring4DValuesTDictionary. 因此我有以下代码:

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. 这是一个错误还是我应该以另一种方式使用迭代器来获得相同的结果?

标签: delphispring4d

解决方案


您的问题是您使用的是实现类而不是基于接口的方法。重要的是要意识到大部分 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您需要的唯一两个单位是SpringSpring.Collections


推荐阅读