C#中的通用Map / Reduce List Extensions

我正在编写一些扩展来模仿地图并减少Lisp中的函数。

public delegate R ReduceFunction(T t, R previous); public delegate void TransformFunction(T t, params object[] args); public static R Reduce(this List list, ReduceFunction r, R initial) { var aggregate = initial; foreach(var t in list) aggregate = r(t,aggregate); return aggregate; } public static void Transform(this List list, TransformFunction f, params object [] args) { foreach(var t in list) f(t,args); } 

转换function将减少如下:

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

这有意义吗? 可能会更好吗?

这些看起来非常类似于Linq中的扩展:

 //takes a function that matches the Func delegate listInstance.Aggregate( startingValue, (x, y) => /* aggregate two subsequent values */ ); //takes a function that matches the Action delegate listInstance.ForEach( x => /* do something with x */); 

为什么第二个例子叫做Transform? 你打算以某种方式更改列表中的值吗? 如果是这种情况,您最好使用ConvertAllSelect

根据这个链接C#3.0中的函数编程:Map / Reduce / Filter如何可以摇滚你的世界以下是System.Linq命名空间中C#的等价物:

  • map – > Enumerable.Select
  • reduce – > Enumerable.Aggregate
  • filter – > Enumerable.Where

我会使用内置的Func委托代替。 这个相同的代码适用于任何IEnumerable。 您的代码将变为:

 public static R Reduce(this IEnumerable list, Func r, R initial) { var aggregate = initial; foreach(var t in list) aggregate = r(t,aggregate); return aggregate; } public static void Transform(this IEnumerable list, Func f) { foreach(var t in list) f(t); } 

您可能想要添加一种方法来执行映射但返回一个新列表,而不是处理传入的列表(并返回列表可以certificate链接其他操作很有用)…也许是一个带有布尔值的重载版本如果你想要返回一个新的列表,如下:

 public static List Transform(this List list, TransformFunction f, params object [] args) { return Transform(list, f, false, args); } public static List Transform(this List list, TransformFunction 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; }