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



我想使用Spring4DTDistinctIterator来获得TDictionary中不同的Values。因此我有以下代码:

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.DictionariesSpring.Collections.Extensions。您只需要SpringSpring.Collections两个单元。

相关内容

  • 没有找到相关文章

最新更新