🎮
競プロでやりがちなC++マクロでfor文を省略するお作法のC#版を考えました
C++の省略for文
#define rep(i,n) for(int i=(0);i<(n);i++)
int main()
{
rep(a, 10) rep(b, 10) rep(c, 10){
if(a + b == c) break;
cout << a + b + c << endl;
}
}
僕が考えたC#の省略for文
static void Rep(int n, Action<int> action) { for (var i = 0; i < n; ++i) { action(i); } }
public static void Main()
{
Rep(10, a => Rep(10, b => Rep(10, c =>
{
if(a + b == c) return;
Console.WriteLine(a + b + c);
})));
}
すごい書きやすいかって言われたらそんなことないんですけど、for(var i=0;i<N;++i)って書くとループ用変数のiが3回も出てくるのがすごく嫌で、多重ループだと書き間違えてても気が付きにくいんですよね。命名で工夫すればいいという話もありますが、この方法なら記述量も少し減るので意外と悪くないかなーという感じです。
C++のマクロと違うポイントとしては、処理の中身がデリゲートなのでbreakやcontinueが使えません。breakはreturnで代替出来ますが、continue使いたいような状況だと少し不便そうです。
おわりに
意見とか良い方法とかあったら教えてください。
他に思いついたら追記するかもしれないです。
Discussion