2014年6月14日土曜日

C#で数値を増やしたり減らしたりする関数を作ってみた

IT速報:プログラミングで数値を増やしたり減らしてみたいんだが

 >int i が0から10まで1ずつ増えて10になったら1ずつ減る ようにしたい
 >それを永遠繰り返したい

C#erっぽい(というかLINQ厨な)コードが無かったのでついカッとなってコーディング。せっかくなので休眠してるブログ使って晒す;

例えばstart=1, count=4の時 1,2,3,4,3,2 という列挙を生成するには
Enumerable.Range(start, count).Concat(Enumerable.Range(start + 1, count - 2).Reverse())
てな感じかなあ、と思っただけ。もっと綺麗に書く方法がありそうな気がするけど、今のところ思いつかず。ということでこの質問者のシナリオ(1~10~1...を無限に繰り返す)に適用するならこう。

            while(true)
            {
                foreach(int i in Enumerable.Range(1, 10).Concat(Enumerable.Range(2, 8).Reverse()))
                {
                    // iに対して何かする
                }
            }


せっかくだから汎用性を持たせるためにライブラリ関数化してみた。一見簡単な仕様だと思ったのに、柔軟性とイレギュラーなケースを考慮してたらそこそこめんどくなった...。

[使い方(テストコード)]
※"{結果}.Is({期待値})"というで期待値確認を行うため、Chaining Assersion For MSTestをNuGetで落として使用。Express EditionでもNuGet使えるのね。
 [ソースコード]