LINQを効率よく利用する話

今日も今日とてC#でソフト開発

LINQってめちゃくちゃ便利でスマートでイケメンですよね。
リスト操作とかついついLINQで一行で書こうと無駄にがんばってしまう。
forループを使わずに処理をかけたときの達成感はその日の仕事の疲れが吹き飛ぶレベル。

でもLINQは結構癖があるから使い方には細心の注意を払わなければいけません、、、と今日先輩に注意されました、、、涙
そんでもってついでにいろいろ教わったのでめもめも

そもそもLINQの癖のもとをたどると「遅延評価」という単語にたどり着く
遅延処理はLINQの実行時にはリストを操作するわけではなく、そのリストの個別の値にアクセスする必要が生じたときにはじめて必要な分だけ処理を行うというもの。かなり省エネな感じ。
イメージ的には以下のような場合

var num =list.Where(item => item>2).Select(item => item*2);

listというオブジェクトをまずwhereという皮でつつんでさらにその周りをselectで包み込んでるような感じ。
データにアクセスする場合はその皮をはがして処理を反映させていく感じ。
listを目指して鎖を手繰り寄せてる感じがしますね。帰社後にしたのサイトで勉強しました↓

LINQを使う場合この必要な時に必要な値だけに処理を行う「省エネ」を意識して使わないと無駄だらけになる。以下怒られた例

List<int> list=old_list;
if(list.Count()>0)
{
~~~~
}

「0じゃないことを確認したいだけなのに全部数える必要ある?」
おっしゃる通りです、、、、
list.Count() ---> list.Any()
が良い
0じゃなくてn個の有無を確認したいときは
list.Skip(n-1).Any()
がいいらしい、、、、スマートだ、、、

あとは無暗にToArray()しないこと。ToArray()にすると全部を配列に格納するからLINQの恩恵が消えると考えるべき。リストで渡せるときはリストのままで、、、

あと
list.Select().Where()
list.Where().Select()

はselectが後ろの方が実行速度が速いらしい。職場の環境での調べなのでデータ数や環境、条件によっては効果のほどは変わるでしょうけど。
やっぱり最初にWhereで絞られるからかな

とまあこんな感じで日々指導されながら成長を感じている次第でございます。C#に触れてはや4か月になろうとしていますがなかなかゆっくりとした成長しませんねえ、、、


この記事が気に入ったらサポートをしてみませんか?