Spring4d:Spring.Collections.IEnumerator 和 System.IEnumerator
Spring4d: Spring.Collections.IEnumerator and System.IEnumerator
我有一个问题,应该是微不足道的,但我找不到任何优雅的答案。
我有一个 IList<string>
的实例,我想获取所有不同(不区分大小写)值的逗号分隔字符串。
我想我应该为此使用 string.Join
助手,因为它有一个很好的重载,可以接受 IEnumerator<string>
作为参数。不幸的是,我遇到了一个障碍:spring4d 重新定义了 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>'
或者,如果我从 distinct 中删除名称空间,则对 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))
现在,如果我们有接口助手,我们可以轻松地为 IEnumerable<string>
编写一个助手并添加 ToDelimitedString
或类似的东西。
我有一个问题,应该是微不足道的,但我找不到任何优雅的答案。
我有一个 IList<string>
的实例,我想获取所有不同(不区分大小写)值的逗号分隔字符串。
我想我应该为此使用 string.Join
助手,因为它有一个很好的重载,可以接受 IEnumerator<string>
作为参数。不幸的是,我遇到了一个障碍:spring4d 重新定义了 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>'
或者,如果我从 distinct 中删除名称空间,则对 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))
现在,如果我们有接口助手,我们可以轻松地为 IEnumerable<string>
编写一个助手并添加 ToDelimitedString
或类似的东西。