2017-11-27 4 views
4

Ich habe ein Problem, das trivial sein sollte, zu dem ich keine elegante Antwort finden kann.Spring4d: Spring.Collections.IEnumerator und System.IEnumerator

Ich habe eine Instanz eines IList<string> und ich möchte eine Komma-getrennte Zeichenfolge aller eindeutigen (Groß- und Kleinschreibung) Werte erhalten.

Ich dachte, ich würde einfach den string.Join Helfer dafür verwenden, da es eine nette Überlastung hat, die einen IEnumerator<string> als Parameter akzeptiert. Leider habe ich einen Haken gefunden: spring4d definiert IEnumerator<T> neu und verwendet natürlich seinen eigenen Typ.

Das Ergebnis ist, dass der folgende Code nicht kompiliert:

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; 

Die Zuordnung zu distinct nicht mit E2010 Incompatible types: 'System.IEnumerator<System.string>' and 'Spring.Collections.Extensions.TDistinctIterator<System.string>'

Alternativ kann, wenn ich den Namespace aus verschiedenen entfernen, dann ist es der Aufruf von string.Join, fehlgeschlagen .

Irgendeine Idee, wie ich das tun sollte? Sie müssen nicht manuell durch die Iteration gehen und den Join manuell durchführen?

Antwort

5

schreiben it yourself (FWIW würde ich gegenüber Parametrierauftrag bevorzugt aber ich halte es so, dass seit der Unterzeichnung von 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; 

Auch können Sie den Code Weg kürzer (keine Notwendigkeit schreiben, um manuell die erstellen Iterator von Spring.Collections.Extensions):

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

wenn wir nun Schnittstelle Helfer hatten wir einen Helfer für IEnumerable<string> leicht schreiben konnte und ToDelimitedString oder so etwas hinzuzufügen.

+0

Vielen Dank, aber ich kann nirgendwo StringJoin finden? Ist es in einem separaten Zweig? – Stephane

+1

Es ist hier in dieser Antwort - deshalb habe ich geschrieben "schreibe es selbst" - sonst hätte ich geschrieben "benutze es von ..." (vergessen, den ersten Parameter/das Komma auf den Anruf in der letzten Zeile obwohl übergeben) –

+0

Sorry ... Lesefehler. – Stephane

Verwandte Themen