2014-10-17 53 views
5

我正在将Haskell的/ LiveScript each函数移植到C#,并且遇到一些麻烦。这个函数的签名是(a → Undefined) → [a] → [a],我在Haskell或LS中打字和lambda表达式的工作非常好,但C#让我感到困惑。最后使用这个扩展的方法应该是:混合扩展方法,泛型和lambda表达式

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]

+2

“我不想使用LINQ”。为什么?你正在重新发明轮子。 – 2014-10-17 19:42:50

+1

Haskell没有'each'函数 - 示例将使用'forM_':'forM_ str putStrLn' – Lee 2014-10-17 19:42:54

+1

'List '也有一个'.foreach()'方法,您可以在其中使用字符串代理 – MethodMan 2014-10-17 19:44:05

回答

10

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

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