C#でもMapBetween

404 Blog Not Found:algorithm – mapBetween – 配列の隣接する2項にそれぞれ演算を施した配列

等差数列 – タイトル

配列の隣接する2項にそれぞれ演算を施した配列を得たい。つまり、

f (+) [1,2,3,4,5] = [3,5,7,9]

のような f が欲しい。

C#でもやってみましょう。

using System;
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);
      }
    }

  }
}

 

やってることは、

  1. souceとsourceの最初を飛ばしたもの用意して

    [1, 2, 3, 4, 5]と[2, 3, 4, 5]
  2. 隣り合うものを組みにして結合し

    [{1,2}, {2,3}, {3,4}, {4,5}]
  3. 引数で指定したFunc<TValue, TValue, TResult>デリゲートの演算結果を戻す

    [3, 5, 7, 9]

だけです。

もちろん拡張メソッドにして使いまわしましょうね。

 

Enjoy!

 

#ソースはGistにもあげました。

広告

C#でもMapBetween」への1件のフィードバック

  1. ピンバック: C#でもMapBetween・改 « be free

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中