delphi - Spring4d:Spring.Collections.IEnumerator 和 System.IEnumerator

标签 delphi delphi-10.2-tokyo spring4d

我有一个应该很微不足道的问题,但我找不到任何优雅的答案。

我有一个 IList<string> 的实例我想获得一个由逗号分隔的所有不同(不区分大小写)值的字符串。

我想我应该使用 string.Join因为它有一个很好的重载,可以接受 IEnumerator<string>作为参数。不幸的是,我发现遇到了障碍: spring4d redefines IEnumerator<T>当然,到处都使用自己的类型。

结果是以下代码无法编译:

var
  distinct: system.IEnumerator<string>;
begin
  result := inherited GetToken;
  if assigned(result) then
  begin
    if not Modules.Contains(STR_DID_SESSION_MODULE) then
      Modules.Add(STR_DID_SESSION_MODULE); 
    distinct := TDistinctIterator<string>.Create(Modules, TIStringComparer.Ordinal);
    result.CustomClaims.Items[STR_CLAIM_CUSTOM_MODULES] := string.Join(',', distinct);
  end;
end;

分配给distinct失败并显示 E2010 Incompatible types: 'System.IEnumerator<System.string>' and 'Spring.Collections.Extensions.TDistinctIterator<System.string>'

或者,如果我从 unique 中删除命名空间,则会调用 string.Join失败了。

知道我应该怎么做吗?缺少手动遍历迭代并手动执行连接?

最佳答案

自己写(FWIW我更喜欢相反的参数顺序,但自从 TStringHelper.Join 的签名以来我一直这样):

function StringJoin(const separator: string; const values: Spring.Collections.IEnumerable<string>): string; overload;
var
  e: Spring.Collections.IEnumerator<string>;
begin
  e := values.GetEnumerator;
  if not e.MoveNext then
    Exit('');
  Result := e.Current;
  while e.MoveNext do
    Result := Result + separator + e.Current;
end;

您还可以编写更短的代码(无需从 Spring.Collections.Extensions 手动创建迭代器):

StringJoin(',', TEnumerable.Distinct<string>(Modules, TStringComparer.OrdinalIgnoreCase))

现在,如果我们有接口(interface)助手,我们可以轻松地为 IEnumerable<string> 编写一个助手。并添加ToDelimitedString或类似的东西。

关于delphi - Spring4d:Spring.Collections.IEnumerator 和 System.IEnumerator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47511615/

相关文章:

Delphi TThread 后代返回结果

delphi - Spring4D中的TForm管理

delphi - 如何在 Spring4d 中创建和使用不区分大小写的 IList<string>

delphi - 控制长时间运行的关键 ISAPI 进程

delphi - 如何用delphi语言从xml文件中读取数据并将其显示在文本框上

delphi - 我可以将 map2dbg 与 64 位 Delphi 可执行文件一起使用吗?

sql-server - 通过 Delphi DLL 连接到 SQL 时 Delphi 10.2 Tokyo 程序抛出 216 错误

Delphi:限制 TCP 连接

delphi - 在应用程序启动时覆盖区域设置

unit-testing - 如何使用 DUnit 模拟 Spring4D 事件