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

标签 delphi spring4d

我想使用 Spring4D TDistinctIteratorTDictionary 中获取不同的 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 中产生访问冲突。这是一个错误还是我应该以另一种方式使用迭代器来获得相同的结果?

最佳答案

您的问题是您使用的是实现类而不是基于接口(interface)的方法。重要的是要认识到,许多 spring4d 代码旨在通过接口(interface)使用,您通常不应引用这些接口(interface)背后的实现类。

你的情况是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 .

关于delphi - Spring4D TDistinctIterator<string>.ToArray() 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68066099/

相关文章:

delphi - Spring4d : Automatic factory with Owner : TComponent parameter?

linux - Delphi/windows 和 Linux/Lazarus 共享字符以上#127

delphi - 当 T 是事件处理程序时 IList<T> 崩溃?

delphi - Spring4d中如何从ServiceLocator获取子接口(interface)实例?

Delphi - 如何使用具有通用接口(interface) GUID 的支持?

Delphi 中的 SQL 查询构建器

delphi - 如何调用存储在Unit中的函数?

delphi - TVirtualTreeview 编辑器如何工作?

delphi - 如何在参数化查询中显式插入空值?