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))