delphi – Spring4d:Spring.Collections.IEnumerator和System.I
我有一个问题应该是微不足道的,但我找不到任何优雅的答案.
我有一个IList< string>的实例我想得到一个逗号分隔的字符串,其中包含所有不同的(不区分大小写)值. 我以为我只是使用了string.Join帮助器,因为它有一个很好的重载,它接受一个I??Enumerator< 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; 对于E2010不兼容类型,对distinct的赋值失败:’System.IEnumerator< System.string>‘和’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或类似的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |