私には問題はありませんが、些細なはずですが、どのような優雅な答えも見つけられません。Spring4d:Spring.Collections.IEnumeratorおよびSystem.IEnumerator
私はIList<string>
のインスタンスを持っていて、そのすべての別々の(大文字小文字を区別しない)値のコンマ区切り文字列を取得したいと考えています。
私はちょうどそれがIEnumerator<string>
をパラメータとして受け入れるいいオーバーロードを持っているので、string.Join
ヘルパーを使うと思っていました。残念なことに、私はつまずくことに気づきました: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>'
で失敗し、それが失敗した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;
:
ありがとうございます。でも、どこにでもStringJoinが見つかりませんか?それは別の支店にありますか? – Stephane
これは、この回答にあります。そのため、私は「自分で書きなさい」と書いています。そうでなければ、「use it from ...」と書いたでしょう(最後の行の最初のパラメータ/ –
申し訳ありませんが読み込みに失敗しました。 – Stephane