2017-11-27 19 views
4

私には問題はありませんが、些細なはずですが、どのような優雅な答えも見つけられません。Spring4d:Spring.Collections.IEnumeratorおよびSystem.IEnumerator

私はIList<string>のインスタンスを持っていて、そのすべての別々の(大文字小文字を区別しない)値のコンマ区切り文字列を取得したいと考えています。

私はちょうどそれがIEnumerator<string>をパラメータとして受け入れるいいオーバーロードを持っているので、string.Joinヘルパーを使うと思っていました。残念なことに、私はつまずくことに気づきました:sp​​ring4dは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>'

で失敗し、それが失敗したstring.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; 

答えて

5

は(私が逆のパラメータの順序を好むだろうが、私はTStringHelper.Joinの署名以来、そのように保たれFWIW)それを自分で書きますSpring.Collections.Extensionsからイテレータ):私たちは、インタフェースのヘルパーを持っていた場合

StringJoin(',', TEnumerable.Distinct<string>(Modules, TStringComparer.OrdinalIgnoreCase)) 

今、私たちは簡単にIEnumerable<string>ためのヘルパーを書いて、ToDelimitedStringまたはそのような何かを追加することができます。

+0

ありがとうございます。でも、どこにでもStringJoinが見つかりませんか?それは別の支店にありますか? – Stephane

+1

これは、この回答にあります。そのため、私は「自分で書きなさい」と書いています。そうでなければ、「use it from ...」と書いたでしょう(最後の行の最初のパラメータ/ –

+0

申し訳ありませんが読み込みに失敗しました。 – Stephane