ラムダ式活用例

リバーシプログラムのために試行錯誤。全体の進捗についてはまた記事書きます。

現在ビットボードの各辺から合法手配列へのアクセス用のインデックスを生成する部分を記述中。ためしにラムダ式を使ってみた部分があったので記念にコピペしときます。コメント少ないのはご愛嬌ということで。

簡単に解説するとCreateAllIndexでCreateIndexを呼び出すときに、ビットボードからのビットの切り出し方をラムダ式で渡してます。すると、回転ビットボードの時とかでちょっとビットの切り出し方が違ってる時でも同じ関数で対応できると言うわけです。(通常のビットボードからは上から8bitずつ単純に切り出すだけ)

		public uint CreateIndex(Bitboard b, Bitboard w, Func<Bitboard, int> GetBitLine)
		{
			var black = GetBitLine(b);
			var white = GetBitLine(w);

			uint a = 0;
			for (int i = 0; i < Board.BoardSize; i++)
			{
				a += ((black >> i) & 1U) * Pow3[i];
				a += ((white >> i) & 1U) * 2 * Pow3[i];
			}
			
			return a;
		}

		public void CreateAllIndex(List<Bitboard> b, List<Bitboard> w)
		{
			for (int i = 0; i < Board.BoardSize; i++)
			{
                //rank, fileはチェス用語?w
				Rank[i] = CreateIndex(b[Board.Occupied], w[Board.Occupied], (bb) =>
				{
					return (int)((bb.p >> i * 8) & 0xFF);
				});
				File[i] = CreateIndex(b[Board.RL90], w[Board.RL90], (bb) =>
				{
					return (int)((bb.p >> i * 8) & 0xFF);
				});
			}
                        //今後回転ビットボードの処理も記述・・・

		}

メリットとしては

  • 無駄にメソッドが増えずに済む=>コード全体が短くなる

デメリットは

  • 実行速度? => 調べてないので分からないw
  • 重複する処理がある => 重複するならデリゲートで定義しておけばおk

こんな感じか?