加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – Spring4d:Spring.Collections.IEnumerator和System.I

发布时间:2020-12-15 09:23:33 所属栏目:大数据 来源:网络整理
导读:我有一个问题应该是微不足道的,但我找不到任何优雅的答案. 我有一个IList string的实例我想得到一个逗号分隔的字符串,其中包含所有不同的(不区分大小写)值. 我以为我只是使用了string.Join帮助器,因为它有一个很好的重载,它接受一个I??Enumerator string作为
我有一个问题应该是微不足道的,但我找不到任何优雅的答案.

我有一个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或类似的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读