2015-05-05 24 views
5

Ich schrieb diese Funktion:Gibt es eine Kartenfunktion?

class function TGenerics.Map<TFrom, TTo>(const AEnumerable: IEnumerable<TFrom>; 
    const AConverter: TConstFunc<TFrom, TTo>): IList<TTo>; 
var 
    L: IList<TTo>; 
begin 
    L := TCollections.CreateList<TTo>; 
    AEnumerable.ForEach(
    procedure(const AItem: TFrom) 
    begin 
     L.Add(AConverter(AItem)); 
    end 
); 
    Result := L; 
end; 

Dies zu Haskells entspricht in etwa map (oder fmap, liftM, etc).

Also ich frage mich, ob so etwas in Spring4D bereits existiert?

+1

Es ist wirklich merkwürdig, dass es 'Where' (Haskell' filter') unterstützt, aber nicht 'Select' (Haskell' map') –

+1

Nur eine Randnotiz - OmniThreadLibrary hat eine parallele Version eines ähnlichen Konstrukts, das TArray auf TArray abbildet (http://www.theldeghigeek.com/2015/01/parallel-map.html). – gabr

Antwort

8

Was Sie suchen, heißt TEnumerable.Select<T, TResult> in Spring.Collections (eingeführt für die noch nicht freigegebenen 1.2 - siehe entwickeln Zweig).

Der Grund für IEnumerable<T> ohne eine Select-Methode ist, dass die Schnittstellentypen cannot have parameterized methods.

Beachten Sie, dass sich die Implementierung in Spring4D von Ihren unterscheidet, da Streaming und verzögerte Ausführung verwendet werden.