Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Spring4d:Spring.Collections.IEnumerator和System.IEnumerator_Delphi_Delphi 10.2 Tokyo_Spring4d - Fatal编程技术网

Delphi Spring4d:Spring.Collections.IEnumerator和System.IEnumerator

Delphi Spring4d:Spring.Collections.IEnumerator和System.IEnumerator,delphi,delphi-10.2-tokyo,spring4d,Delphi,Delphi 10.2 Tokyo,Spring4d,我有一个问题应该是琐碎的,但我找不到任何优雅的答案 我有一个IList的实例,我想得到一个逗号分隔的字符串,它包含所有不同的(不区分大小写)值 我想我应该使用string.Joinhelper,因为它有一个很好的重载,可以接受IEnumerator作为参数。不幸的是,我发现遇到了一个障碍:spring4d重新定义了IEnumerator,当然,在任何地方都使用它自己的类型 结果是以下代码无法编译: var distinct: system.IEnumerator<string>;

我有一个问题应该是琐碎的,但我找不到任何优雅的答案

我有一个
IList
的实例,我想得到一个逗号分隔的字符串,它包含所有不同的(不区分大小写)值

我想我应该使用
string.Join
helper,因为它有一个很好的重载,可以接受
IEnumerator
作为参数。不幸的是,我发现遇到了一个障碍:spring4d重新定义了
IEnumerator
,当然,在任何地方都使用它自己的类型

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

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;
var
独特的:system.IEnumerator;
开始
结果:=遗传性GetToken;
如果分配(结果),则
开始
如果不是Modules.Contains(STR\u DID\u SESSION\u MODULE),则
Modules.Add(STR_DID_SESSION_MODULE);
distinct:=tdistinciterator.Create(模块,TIStringComparer.Ordinal);
result.CustomClaims.Items[STR_CLAIM_CUSTOM_MODULES]:=string.Join(',',distinct);
结束;
结束;
由于E2010不兼容类型:“System.IEnumerator”和“Spring.Collections.Extensions.TDistInctivator”

或者,如果我从distinct中删除名称空间,则调用
string.Join
失败

你知道我该怎么做吗?除了手动遍历迭代和手动执行联接之外?

自己编写(FWIW我更喜欢相反的参数顺序,但我保留了它,因为签名是
TStringHelper.join
):


现在,如果我们有接口帮助程序,我们可以轻松地为
IEnumerable
编写一个帮助程序,并添加
todelimitestring
或类似的内容。

谢谢,但我在任何地方都找不到StringJoin?它是在一个单独的分支上吗?答案就在这里-这就是为什么我写了“自己写”-否则我会写“从…使用它”(忘记在最后一行传递第一个参数/调用上的逗号)
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;
StringJoin(',', TEnumerable.Distinct<string>(Modules, TStringComparer.OrdinalIgnoreCase))