【问题标题】:Spring4D TDistinctIterator<string>.ToArray() not working?Spring4D TDistinctIterator<string>.ToArray() 不工作?
【发布时间】:2021-09-05 00:25:13
【问题描述】:

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

【问题讨论】:

    标签: delphi spring4d


    【解决方案1】:

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

    在您的情况下,TDistinctIterator&lt;T&gt; 的生命周期由引用计数管理。您的代码没有正确处理生命周期管理,并且TDistinctIterator&lt;String&gt; 实例在您调用ToArray 之前被销毁,从而导致访问冲突。

    除了TDistinctIterator&lt;T&gt; 的问题之外,您的代码也没有正确处理字典的生命周期。

    您的代码应如下所示:

    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

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 2016-11-01
      • 2011-05-19
      • 1970-01-01
      • 2014-01-13
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多