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 で公開されています(後者はクエリ式をメソッドに変更しています)。
動作としては、以下の通りです。
- 俳句の文字列をカンマで分割してList<string>型のリスト(hHaiku)にまとめ、各句の中で最も多い文字数を要素数とする空文字リスト(vHaiku)を別に作成します。
- hHaikuの各要素において文字数がvHaikuの要素数になるように、PadRightメソッドを使って不足分を全角スペースでパディングします。それを一旦char型配列に変換し、Enumerable.Selectメソッドを使って1文字1文字をstring型に変換します。
- 2.で作成したリストとvHaikuをEnumerable.Zipメソッドで、各要素同士を結合してvHaikuに代入します。この時、要素の並びを「2.で作成したリスト」→「vHaiku」の順にします。
- 最後にvHaikuの各要素において、Console.WriteLineメソッドで出力します。
2.で各句にパディング処理をした理由として、Enumerable.Zipは片方のリストの要素数が少ないと、その要素数分のみ適用されないので、要素数を各句の中で最も多い文字数にそろえるためですよっ!
3.で2つのリスト各要素の並びを逆にして結合することで、4.の出力時に右縦書きになりますっ!
paiza.IO上で実行すると、こんな感じです。LINQって便利だな~♪(某クッキングシートのcm風)
ではでは、See you♪
コメント