2012-01-20 279 views
2

我想知道如何使用lambda表达式进行函数组合。 我的意思是,我有2个函数f(x)和g(x)。如何使用lambda表达式来组合f(g(x))? 感谢lambda表达式c#

+0

你不需要这个表达式。普通代表就够了。 – leppie

+2

请注意,“lambda表达式”仅仅是代码 - 它并没有告诉我们这是成为委托还是表达式树。所示的两个答案是针对代表的;如果它实际上是一个表达树,请说。 –

回答

2

通用版本:

static Func<T, T> Compose<T>(params Func<T, T>[] ff) 
{ 
    Func<T, T> id = x => x; 

    foreach (var f in ff) 
    { 
    var i = f; 
    var idd = id; 
    id = x => i(idd(x)); 
    } 

    return id; 
} 

由于C#的缺乏适当的词汇范围,我们需要一大堆不同的名字临时变量。

+0

这给出了'g(f(x))',它可能不一样。为了演示如何用f和g从我的基本答案中进行尝试:'Console.WriteLine(Compose(f,g)(5));'输出12而不是11. – TrueWill

+0

@TueWill:只需改变'i(idd(x))'到'idd(i(x))':) – leppie

2
Func<int, int> f = x => x + 1; 
Func<int, int> g = x => x * 2; 
Func<int, int> fg = x => f(g(x)); 

Console.WriteLine(fg(5)); 
2

你的问题很简单,我不知道如果我很好,但是我觉得这是你所需要的:

Func<int,int> compose(Func<int,int> f, Func<int,int> g) 
{ 
    return x=>f(g(x)); 
} 

var fg = compose(f,g); 

Func<int,int> f = .... 
Func<int,int> g = .... 
Func<int,int> fg = compose(f,g); 

与C#的问题是,你需要为每个不同的方法签名编写这样的组合函数,因此您无法使用通用方法编写函数。

+0

谢谢大家,这就是我正在寻找的 –