28

Lisp で map 関数と reduce 関数を模倣する拡張機能をいくつか書いています。

public delegate R ReduceFunction<T,R>(T t, R previous);
public delegate void TransformFunction<T>(T t, params object[] args);

public static R Reduce<T,R>(this List<T> list, ReduceFunction<T,R> r, R initial)
{
     var aggregate = initial;
     foreach(var t in list)
         aggregate = r(t,aggregate);

     return aggregate;
}
public static void Transform<T>(this List<T> list, TransformFunction<T> f, params object [] args)
{
    foreach(var t in list)
         f(t,args);
}

変換関数は、次のようなクラフトを削減します。

foreach(var t in list)
    if(conditions && moreconditions)
        //do work etc

これは理にかなっていますか?それはもっと良いでしょうか?

4

5 に答える 5

53

このリンクFunctional Programming in C# 3.0: How Map/Reduce/Filter can Rock your Worldによると、以下は System.Linq 名前空間の下の C# に相当します。

于 2008-11-10T16:10:55.737 に答える
35

これらはすでにLinqの拡張機能と非常によく似ています。

//takes a function that matches the Func<T,R> delegate
listInstance.Aggregate( 
    startingValue, 
    (x, y) => /* aggregate two subsequent values */ );

//takes a function that matches the Action<T> delegate
listInstance.ForEach( 
    x => /* do something with x */);

2番目の例がTransformと呼ばれるのはなぜですか?どういうわけかリストの値を変更するつもりですか?その場合は、ConvertAll<T>またはを使用した方がよい場合がありますSelect<T>

于 2008-09-02T17:49:54.080 に答える
2

代わりに組み込みの Func デリゲートを使用します。この同じコードは、任意の IEnumerable で機能します。コードは次のようになります。

public static R Reduce<T,R>(this IEnumerable<T> list, Func<T,R> r, R initial)
{
     var aggregate = initial;
     foreach(var t in list)
         aggregate = r(t,aggregate);

     return aggregate;
}
public static void Transform<T>(this IEnumerable<T> list, Func<T> f)
{
    foreach(var t in list)
             f(t);
}
于 2008-09-02T17:23:32.630 に答える
1

渡されたリストで作業する代わりに、マップを実行する方法を追加して新しいリストを返したい場合があります (リストを返すと、他の操作を連鎖させるのに役立つ場合があります)...おそらく、ブール値を示すオーバーロードされたバージョン新しいリストを返すかどうかは、次のようになります。

public static List<T> Transform<T>(this List<T> list, TransformFunction<T> f,
        params object [] args)
{
    return Transform(list, f, false, args);
}

public static List<T> Transform<T>(this List<T> list, TransformFunction<T> f,
        bool create, params object [] args)
{
    // Add code to create if create is true (sorry,
    // too lazy to actually code this up)
    foreach(var t in list)
         f(t,args);
    return list;
}
于 2008-09-02T17:25:45.930 に答える