C#でもMapBetween
404 Blog Not Found:algorithm – mapBetween – 配列の隣接する2項にそれぞれ演算を施した配列
配列の隣接する2項にそれぞれ演算を施した配列を得たい。つまり、
f (+) [1,2,3,4,5] = [3,5,7,9]のような f が欲しい。
C#でもやってみましょう。
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
public static class EnumerableEx
{
public static IEnumerable<TResult> MapBetween<TValue, TResult>(this IEnumerable<TValue> source, Func<TValue, TValue, TResult> f)
{
return from a in source.Select((x, i) => new { X = x, Index = i })
join b in source.Skip(1).Select((x, i) => new { X = x, Index = i }) on a.Index equals b.Index
select f(a.X, b.X);
}
}
public class Program
{
static void Main(string[] args)
{
var q = new[] { 1, 2, 3, 4, 5 }.MapBetween((a, b) => a + b);
foreach (var n in q)
{
Console.WriteLine(n);
}
}
}
}
やってることは、
- souceとsourceの最初を飛ばしたもの用意して
[1, 2, 3, 4, 5]と[2, 3, 4, 5] - 隣り合うものを組みにして結合し
[{1,2}, {2,3}, {3,4}, {4,5}] - 引数で指定したFunc<TValue, TValue, TResult>デリゲートの演算結果を戻す
[3, 5, 7, 9]
だけです。
もちろん拡張メソッドにして使いまわしましょうね。
Enjoy!
#ソースはGistにもあげました。



コメント1件
コメントするトラックバック