我正在编写一些扩展来模仿地图并减少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); }
转换功能将减少如下:
foreach(var t in list) if(conditions && moreconditions) //do work etc
这有意义吗?会更好吗?
根据这个链接C#3.0中的函数编程:Map/Reduce/Filter如何可以摇滚你的世界以下是System.Linq命名空间中C#的等价物:
map - > Enumerable.Select
reduce - > Enumerable.Aggregate
过滤器 - > Enumerable.Where
这些看起来非常类似于Linq中的扩展:
//takes a function that matches the Funcdelegate 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?你打算以某种方式更改列表中的值吗?如果是这种情况你可能最好使用ConvertAll
或Select
.