「いつもソースが長くなってしまう」というアナタ。foreachをLINQで書き換えることから始めてみよう。
見たことはないだろうか? foreachの入れ子、あるいはforeachの後にすぐ別のforeachが来るC#のソースを。foreachクン自体には何の罪もないけれど、ついソースを長くさせてしまう困ったちゃんなのは事実。そこで、foreachをLINQで書き換えてみよう。「今までのあの苦労は何だったんだ……」となること請け合いなスリムアップ効果が期待できる。
Contents [hide]
準備
ファーストネームとラストネーム、それから年齢を持つPersonなるクラスを定義する。
このクラスのインスタンスを持つPeopleなる配列を準備する。
さあさあお立ち会い!このpeopleに対する操作をforeachで書いた後、それをLINQにするとどれだけスマート&スリムになるかを紹介する。
ラストネームがSmithの人だけ集める
まずはラストネームがSmithの人(AdaとPhil)だけを集める操作から。foreachで書くとこうなる。
これをLINQで書くと……
一行!エコですね〜。
Smithのうち老けてる方の年齢を出す
こうして集めたSmith人のうち年かさを増している人の年齢を取得してみよう。例によってforeachから。
これをLINQで書くとこうなる。
またもや一行に!
全員の年齢を足す
今度は全員の年齢を足してみよう。まずはforeachバージョン。
これをLINQで書きなおしてみる。まさかまた一行なんてことは……
タマラナイね。
最後のAdaだけ取り出す
最後に、ファーストネームがAdaの人のうちpeopleの後の方に入っている人を探してみる。
やっぱりforeachから。
そしてこれがLINQバージョン。
もう当たり前のように短くなるね。
foreachをLINQで書き換えよう
LINQの威力をわかってくれた事と思う。
今回のようなコレクションから要素を取り出すような操作をする場合、取り出した要素を格納しておくための変数を用意し、ループ内で条件判定するのがforeachの定石だ。そこへ来てLINQはというと、すごく大雑把な言い方をするとそれらを一文で書けてしまう。
foreach自体には何の意味もないため、ループ内の処理を見ないと何がしたいかが掴みづらい。LINQはメソッド名を見れば意味が掴めるという良さもある。
foreachに対するLINQの良さはこのように色々あるけれど、すべてのループ処理をLINQで書き換えられるわけではない。ただ、書き換えられるなら劇的にスリムなソースになる。
「ついついソースが長くなってしまって^^;」というアナタは、foreachをLINQで書き換えられないか見直すことから始めてみよう。
更にスマートなC#erになりたいアナタへおすすめのLINQ本