繁体   English   中英

混合扩展方法,泛型和lambda表达式

[英]Mixing extension methods, generics and lambda expressions

我正在将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));

而且,有了这个,我的输出应该是:

Haskell
Scheme
Perl
Clojure
LiveScript
Erlang

我目前自己实现的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);
  }
}

问题是,我在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
}

有人能帮助我吗? 我搜索了它,但对我来说还不清楚。 [我不希望使用Linq]

您需要Action<T>而不是Action 您也可以直接调用它而不是使用DynamicInvoke

public static void Each<T>(this IEnumberable<T> list, Action<T> a)
{
  foreach (var result in list)
  {
    a(result);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM