Rau*_*otz 33 c# lambda currying
给定一个DoSomething采用(无参数)函数的方法并以某种方式处理它.有没有更好的方法为参数的函数创建"重载"而不是下面的代码片段?
public static TResult DoSomething<TResult>(Func<TResult> func)
{
//call func() and do something else
}
public static TResult DoSomething<T0, TResult>(
Func<T0, TResult> func,
T0 arg0)
{
return DoSomething(() => func(arg0));
}
public static TResult DoSomething<T0, T1, TResult>(
Func<T0, T1, TResult> func,
T0 arg0, T1 arg1)
{
return DoSomething(arg => func(arg, arg1), arg0);
}
public static TResult DoSomething<T0, T1, T2, TResult>(
Func<T0, T1, T2, TResult> func,
T0 arg0, T1 arg1, T2 arg2)
{
return DoSomething(arg => func(arg, arg1, arg2), arg0);
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 31
编辑:如评论中所述,这是部分应用而不是currying.我写了一篇关于我对差异的理解的博客文章,人们可能会感兴趣.
嗯,它并没有特别的不同 - 但我将currying部分与"调用DoSomething"部分区分开来:
public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
return () => func(arg);
}
public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
TArg1 arg1, TArg2 arg2)
{
return () => func(arg1, arg2);
}
// etc
Run Code Online (Sandbox Code Playgroud)
然后:
DoSomething(Apply(foo, 1));
Run Code Online (Sandbox Code Playgroud)
这样,您可以在其他情况下重用currying代码 - 包括您不想立即调用新返回的委托的情况.(例如,您可能希望稍后再讨论它.)
| 归档时间: |
|
| 查看次数: |
16604 次 |
| 最近记录: |