在C#中滾動自己是一個有趣的練習,這裏是af我的新聞。 (另請參閱here)
請注意,對於IEnumerable而言,iter/foreach稍有爭議 - 我認爲是因爲您必須爲IEnumerable「敲定」(或任何單詞)IEnumerable才能實際發生任何事情。
//mimic fsharp map function (it's select in c#)
public static IEnumerable<TResult> Map<T, TResult>(this IEnumerable<T> input, Func<T, TResult> func)
{
foreach (T val in input)
yield return func(val);
}
//mimic fsharp mapi function (doens't exist in C#, I think)
public static IEnumerable<TResult> MapI<T, TResult>(this IEnumerable<T> input, Func<int, T, TResult> func)
{
int i = 0;
foreach (T val in input)
{
yield return func(i, val);
i++;
}
}
//mimic fsharp fold function (it's Aggregate in c#)
public static TResult Fold<T, TResult>(this IEnumerable<T> input, Func<T, TResult, TResult> func, TResult seed)
{
TResult ret = seed;
foreach (T val in input)
ret = func(val, ret);
return ret;
}
//mimic fsharp foldi function (doens't exist in C#, I think)
public static TResult FoldI<T, TResult>(this IEnumerable<T> input, Func<int, T, TResult, TResult> func, TResult seed)
{
int i = 0;
TResult ret = seed;
foreach (T val in input)
{
ret = func(i, val, ret);
i++;
}
return ret;
}
//mimic fsharp iter function
public static void Iter<T>(this IEnumerable<T> input, Action<T> action)
{
input.ToList().ForEach(action);
}
mapi等價物確實存在作爲Select的重載。此外,它似乎有點沉重的轉換您的枚舉爲列表,而不是做一個正常的foreach循環,每次調用動作... – 2009-04-14 23:19:45
不知道選擇超載,謝謝你。 ToList是我想到的第一件事,我想。 – Benjol 2009-04-15 06:16:29