【发布时间】:2013-03-28 14:59:50
【问题描述】:
我有一些委托和一个方法:
delegate Point Translate(Point p);
delegate Translate Transform(Translate t);
Translate forward = p => new Point(p.X + 1, p.Y);
问题:如何实现这样的方法:
Transform Rotate90 = ??
这样Rotate90 将任何Translate 函数顺时针旋转90。所以:
Point startPoint = new Point(1, 1);
Point endPoint = (Rotate90(forward))(startPoint);
//desired output: Point(1, 0)
编辑 1:
我不会一点一点地应用Translate 函数。我需要的是在一个点上应用一些转换后的函数(Translate 已经旋转或反射的函数)。
我需要什么:我如何写一个Rotate90,如果我将它传递给(p=>new Point(p.X+1, p.y)),它会返回一个与(p=>new Point(p.X, p.Y-1)) 效果相同的函数。
编辑 2: 一些示例:
Translate forward = p => new Point(p.X + 1, p.Y);
Translate backward = p => new Point(p.X - 1, p.Y);
Translate downward = p => new Point(p.X, p.Y - 1);
Translate runningForward = p => new Point(p.X + 5, p.Y);
Transform Rotate90Cw = ??
Point samplePoint = new Point(1, 1);
Point p1 = (Rotate90Cw(forward))(samplePoint); //must be (1,0)
Point p2 = (Rotate90Cw(backward))(samplePoint); //must be (1,2)
Point p3 = (Rotate90Cw(downward))(samplePoint); //must be (0,1)
Point p4 = (Rotate90Cw(runningForward))(samplePoint); //must be (1,-4)
Point p4 = (Rotate90Cw(Rotate90Cw(forward)))(samplePoint); //must be (0,1)
我需要一个单个
Rotate90Cw函数,它可以应用于任何Translate函数并返回正确的Translate函数。所以在一个点上应用Rotate90Cw(forward)的效果与在一个点上应用downward的效果是一样的。等等……
我不会为每种情况创建单独的 Rotate 函数(例如 forwardRotated、downRotated 和 ...
【问题讨论】:
-
如何使用与 LINQ 设计相同的扩展方法覆盖?
标签: c# delegates lambda anonymous-function