b00k.jp ~積み上げ式読書ノート~
公開日:
最終更新日:2018/08/01

【LINQ】LINQの3つの仕組みを詳しく解説

LINQ

データに対し統一的なアクセス手段を提供してくれるLINQは便利な機能ではあるが、クセの強い特徴がある。
基本的にはそれらを意識しなくても効率的な形で実行されるのだが、場合によってはそれが裏目に出る時もある。
そうならないためにも、簡単にLINQの内部処理を理解することは重要である。

以下にLINQの3つの特徴を説明していく。

式を解析して効率化してくれる

【出力結果】

コード上は、IsEven()のループ(※1)を回してから、IsMultipleOf4のループ(※2)を回している。
しかし、出力を見ると、ループが1回にまとまっていることがわかる。(1回のループで※1と※2が同時に実行されている。)
このようにLINQは式を解析して、最適な形で実行をしてくれる。

ただし、最適化が適用されるのは一つのメソッドチェーンで表せる範囲のみ。
例えば、上記のケースだと

という風に一つのメソッドチェーンで表すことができる。

しかし、以下のようなケースでは、IsEven()のループが2回まわってしまい、非効率な形で実施されてしまう。

【出力結果】

LINQは基本的には最適な形で実行されるが、場合によっては非効率な形式になってしまうこともある。

LINQが扱う式は実体がない

LINQが扱う式は実体をもたない。
コレクションに対し、どういう命令をするかという情報だけを返す。
メモリ上に新しいコレクションを生成するわけではない。

この性質のために、上記では非効率な形で式が実行されてしまっている。
(var evensはあくまで、listに対しIsEven()を実施するという情報のみ。
実際にint mul4などで必要になった時に、式が実行される。)

上のケースでIsEven()のループを先に実施してしまいたい場合は、以下のようにコレクションを実体化すればよい。

【出力結果】

結果が必要になったら計算される(遅延実行)

先述したように、LINQの式は実体を持たず、実際にその値が使用される時にならないと計算は実行されない。
この実際にその値が使用される時というのは、より厳密にいうと「値が必要になってMoveNext()メソッドが実行された時」である。

例えば、以下のコードで考えてみる。

これは、メソッドチェーンによって最適化されるので、以下のようになる。

さらに、LINQの実体はforeach文なので、以下のように書き換えられる。

さらにforeach文はコンパイル後は以下のような文に解析される。(参考)

つまり、上記の※1のMoveNext()が実行される時に、はじめて計算が実行されることになる。

カテゴリー: IT, プログラミング
タグ   : ,

努力が続かないとお悩みの方へ!

努力のコツ PC用バナー

Amazonにて発売中!!

試験に受かる、給料を上げる、ビジネスを立ち上げる…。
自分の人生をよりよくしていくには、何よりも努力が欠かせません。
しかし、そうはわかっていてもなかなか続かないもの。。。
「めんどくさい」、「明日からでいいや」、「どうせやっても無駄だし」…
こんな風に私たちは努力を続けられずにいます。

ですが、それはあなたが怠けものだからとか、根性がないからというわけではありません。
どうすれば努力が続くのか、その「テクニック」を知らないだけなのです!
本書では、そんな「どうすれば努力が続くのか」というテクニックや心構えを集めました。
「達成したい夢があるのに、どうしても頑張れない…」
そんなあなたに是非とも読んでほしい1冊となっています。


広告

オススメ記事


PAGE TOP ↑