[英]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.