俳句プログラミングでC# をするならLINQも使いたいですっ!

Myoga-SB-SDF-A2

Hello~! ミョウガです!

今回はC#とLINQを使って俳句を縦書きで出力してみましたよっ!

1. C#とLINQで俳句を縦書きで出力するプログラム

using System;
using System.Collections.Generic;
using System.Linq;

namespace Haiku {
	class Program {
		static void Main( string[] args ) {

			// 俳句をカンマで分割します。
			// 右辺を args.ToList() にすると、コマンドラインから俳句を入力することになります。
			List<string> hHaiku = "初桜,折しも今日は,よき日なり".Split( ',' ).ToList();

			// 要素数が各句の中で最大の文字数の空文字列リストを作成します。
			List<string> vHaiku = Enumerable.Repeat( "", hHaiku.Max( ( hPhrase ) => hPhrase.Length ) ).ToList();

			// 各句において、文字数がvHaiku.Count()になるように不足分を全角スペースでパディングした文字列を
			// char型配列にばらし、クエリ式でchar型文字をそれぞれ文字列に変換して、string型の文字リストを
			// 生成します。そのリストをZipメソッドでそれぞれの要素において、文字を逆順で結合します。
			hHaiku.ForEach( ( hPhrase ) =>
				vHaiku = vHaiku.Zip(
					from hpChar in hPhrase.PadRight( vHaiku.Count(), ' ' ).ToCharArray()
					select hpChar.ToString(),
					( first, second ) => second + first		// ← ここ重要
				).ToList()
			);

			// 文字列のリストを要素ごとに改行して出力します。
			vHaiku.ForEach( Console.WriteLine );

		}
	}
}

※このプログラムは https://gist.github.com/Myoga1012/f8f57b5239f945af569e  及び https://paiza.io/projects/b36V-DRQhLmPnxi2oNMtKg で公開されています(後者はクエリ式をメソッドに変更しています)。

動作としては、以下の通りです。

  1. 俳句の文字列をカンマで分割してList<string>型のリスト(hHaiku)にまとめ、各句の中で最も多い文字数を要素数とする空文字リスト(vHaiku)を別に作成します。
  2. hHaikuの各要素において文字数がvHaikuの要素数になるように、PadRightメソッドを使って不足分を全角スペースでパディングします。それを一旦char型配列に変換し、Enumerable.Selectメソッドを使って1文字1文字をstring型に変換します。
  3. 2.で作成したリストとvHaikuをEnumerable.Zipメソッドで、各要素同士を結合してvHaikuに代入します。この時、要素の並びを「2.で作成したリスト」→「vHaiku」の順にします。
  4. 最後にvHaikuの各要素において、Console.WriteLineメソッドで出力します。

2.で各句にパディング処理をした理由として、Enumerable.Zipは片方のリストの要素数が少ないと、その要素数分のみ適用されないので、要素数を各句の中で最も多い文字数にそろえるためですよっ!

3.で2つのリスト各要素の並びを逆にして結合することで、4.の出力時に右縦書きになりますっ!

paiza.IO上で実行すると、こんな感じです。LINQって便利だな~♪(某クッキングシートのcm風)

haiku-cslinq

ではでは、See you♪

この記事をシェアする
Chronoir.netのRSSフィードを購読する

ミョウガ(Myoga)

Hello~! 「ミョウガ」です。よろしくお願いします!(≧▽≦)/ 主にC#/XAML/C++などをメインにプログラミングやアプリの開発をしています。好きな物はカフェラテとハーブティ、趣味は写真撮影と艦これです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください