首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合扩展方法、泛型和lambda表达式

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

Stack Overflow用户
提问于 2014-10-17 19:38:43
回答 1查看 370关注 0票数 5

我正在将Haskell的/LiveScript each函数移植到C#,并且遇到了一些问题。这个函数的签名是(a → Undefined) → [a] → [a],我在Haskell或LS中很好地使用了输入和lambda表达式,但是C#使我感到困惑。这种扩展方法的最终使用应该是:

代码语言:javascript
复制
String[] str = { "Haskell", "Scheme", "Perl", "Clojure", "LiveScript", "Erlang" };
str.Each((x) => Console.WriteLine(x));

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

代码语言:javascript
复制
Haskell
Scheme
Perl
Clojure
LiveScript
Erlang

我自己目前对each的实现是:

代码语言:javascript
复制
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实现的人,它用于副作用,返回自己的列表,并将列表的每个值作为参数进行闭包迭代和传递。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 19:41:36

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

代码语言:javascript
复制
public static void Each<T>(this IEnumberable<T> list, Action<T> a)
{
  foreach (var result in list)
  {
    a(result);
  }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26432271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档