我正在将Haskell的/ LiveScript each函数移植到C#,我遇到了一些麻烦.这个函数的签名是(a ? Undefined) ? [a] ? [a]和Haskell或LS中的输入和lambda表达式一起工作得很好,但是C#让我很困惑.此扩展方法的最终用法应为:
String[] str = { "Haskell", "Scheme", "Perl", "Clojure", "LiveScript", "Erlang" };
str.Each((x) => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
而且,有了这个,我的输出应该是:
Haskell
Scheme
Perl
Clojure
LiveScript
Erlang
Run Code Online (Sandbox Code Playgroud)
我目前自己的实现each是:
public static void Each<T>(this IEnumberable<T> list, Action closure)
{
foreach (var result in list)
{
Delegate d = closure;
object[] parameters = { result };
d.DynamicInvoke(parameters);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我在lambda表达式中无法传递参数.我做不到(x) => ....
如何将参数传递给lambda表达式?使用Haskell中的第一类函数比使用C#更容易.我很困惑.
对于那些不知道Each实现的人,它用于副作用,返回自己的列表并应用闭包迭代并将列表的每个值作为参数传递.它在PHP中的实现应该是:
public static function each($func) {
// where $this->value is a list
foreach ($this->value as $xs) {
$func($xs);
}
return $this->value;
// Or return $this; in case of method-chaining
}
Run Code Online (Sandbox Code Playgroud)
有人能帮助我吗?我搜索了它,但对我来说还不清楚.[我不希望使用Linq]
Lee*_*Lee 10
你需要一个Action<T>而不是一个Action.您也可以直接调用它而不是使用DynamicInvoke:
public static void Each<T>(this IEnumberable<T> list, Action<T> a)
{
foreach (var result in list)
{
a(result);
}
}
Run Code Online (Sandbox Code Playgroud)