我想使用Spring4D TDistinctIterator在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中产生访问冲突。这是一个bug吗?或者我应该以另一种方式使用迭代器来获得相同的结果?
发布于 2021-06-21 18:35:20
您的问题是您使用的是实现类,而不是基于接口的方法。重要的是要认识到,大部分spring4d代码都是通过接口使用的,您通常不应该引用这些接口背后的实现类。
在您的例子中,TDistinctIterator<T>的生命周期是通过引用计数来管理的。您的代码没有正确地处理该生存期管理,并且在您调用ToArray之前TDistinctIterator<String>实例已被销毁,从而导致访问冲突。
除了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。
https://stackoverflow.com/questions/68066099
复制相似问题