SlideShare a Scribd company logo
LINQ基本のキ 
第8回まどべんよっかいち2014.3.29 Kouji Matsui (@kekyo2 kekyo.wordpress.com)
や、やばい... 
人、来るのか?(現在4名) 
進捗、ダメ(2014.3.26現在)
気を取り直して、執筆しよう... 
例えば、以下のような情報を引き出したいとします。 
指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパブリックな クラスを抽出。(リフレクションでやりますよ)
こんなコードか。
まぁ、難しくはない... 
じゃあ、これならどう? 
指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパブリックな クラスで、プロテクトかつバーチャルなメソッドを一つ以上保持するクラスを抽出。
見たような定型ロジックコード 
フラグ増えた 
フラグの有効範囲 
フラグの組み合わせ 
ネストしまくるブロック 
ネストしまくるforeach
「全てはコントロール配下にあります。問題ありません」 
更なる変更 
指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパブリックな クラスで、プロテクトかつバーチャルなメソッドを一つ以上保持するか、又はパブリッ クなプロパティが2つ以上存在し、かつ、それらのプロパティと同じ名称のプロパティ 持つクラスが他に存在するクラスを抽出。
やめろぉ、クソコードぉ、ぶっとばすぞぉ 
誰もが嫌がる 
クソコード 
ここに完成!!!
コレクション操作はLINQで書け!! 
「SQL Serverでなら簡単にデータを抽出できるのに、C#やVB.NETで書くとめんどくさい んだよなぁ...」 
とか、 
「コレクションのデータは、すべからくforやforeach、while等で分岐しながら書くのが当 たり前、いや、その方が判りやすいでしょ?」 
IT技術者やり直してください 
(ちなみに本当にあった怖い話)
まだ納得が行かないのなら、物的証拠 
100に近いほど保守が容易。 
1メソッド43はかなり悪い 
大きいほどルートの組み合わせが多い。17って... 
Wikipedia: 「循環的複雑度(英: Cyclomaticcomplexity)とは、 ソフトウェア測定法の一種である。プログラムのソースコードから、 線形的に独立した経路の数を直接数える。」 
こんなコードは、 
テスト不能
LINQは集合演算を(.NETの世界で)一般化したもの 
LINQ食わず嫌いあるある 
SQL文を考えられる能力を持ちながら、DBから抜けてC#などの言語で実装し ようとした途端に、何故かロジックに落として実装しようとしてしまう。 
日頃からSQLの集合演算と同じことが、C#などの言語で書ければなぁと感じつ つ、いざ実装するとロジックで書いてしまう。 
STOP!ロジック化ロジック化は最後の手段だ
ロジックじゃない、集合の操作なんだ 
例えば、以下のような情報を引き出したいとします。 
指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパブリックな クラスを抽出。 
やることが2つある。 
①複数個のdllをロードして、集合を作る 
②その集合からパブリックなクラスを抽出する *.dll(assemblies) classespublics
集合のまま、処理するんだ。雑念は捨てよ。
もっと短く書ける 
リスト化するまでは、実際に抽出処理が行われ ていない。これをLINQの遅延実行という。
クエリの読みかたは「上から下へ」 
SQL文と微妙に違う(特にselect)ところに戸惑うアナタへ。 
どの集合から抽出をはじめるのか 
上から下へ順番に処理される。selectも例外ではない!! 
これらのクエリが代入される
そろそろ強力に見えてくる 
じゃあ、これならどう? 
指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパブリックな クラスで、プロテクトかつバーチャルなメソッドを一つ以上保持するクラスを抽出。 
この集合演算だけ付け加えればよい
サブクエリだって書ける。実は単なる判定式 
Any()は集合演算結果が1件以上存在するか どうかを返す。Count() >= 1 とする方法もあ るが、Any()の方が効率が良い。
え? 
クエリが長くて読みずらいって? 
いや、.NETなんだから、どうとでも出来るでしょ?
リファクタリングしよう 
サブクエリが長くて読みにくいので、 そこだけ別のメソッドとして分離 
普通に呼び出すだけ
LINQ誤解あるある 
いままでの話に、 
データベースを扱う例は出ませんでしたね? (SQLの考え方みたいな話はしましたが) 
一般的な、配列やコレクションの操作に、LINQが使えるって話です。 
決して、LINQはデータベース操作の 「何か」ではありません。
でも、物の記事にはデータベースとの統合ががが 
出来ますよ。ちゃぶ台を返しますが、 
同じLINQ集合演算の記述で、データベースに 直接クエリを発行できます。 
?!?でも、さっきの例は配列やコレクションを操作してたよね?じゃあ、データ ベースからレコードを取得したら、全部メモリに読み込まれてからしか抽出できな いのでは??何百万件データがあったら使い物にならないじゃん?
LINQ誤解あるあるその2 
配列やコレクションの操作は「LINQ to Objects」と呼 
ばれるクラス群を使用し、データベースは「LINQ to 
Entities」と呼ばれるクラス群を使います。 
しかし、使い方は殆ど一緒(クエリの書 
き方も一緒)なので、これらがごっちゃに語られる 
事が多いのです。 
しかも、これらのクエリ(Entities)を連結し、データ 
ベースから抽出した複数のクエリの集合演算を、メモ 
リ上(Objects)で実行する事さえできます。
標準の集合演算子がいっぱいあるよ 
フィルタWhere 
射影(別のクラスに入れ替えたりする)Select, SelectMany 
ソートOrderBy, OrderByDescending, ThenBy, ThenByDescending 
結合Join, GroupBy, GroupJoin, Concat, Union, Zip 
集合演算Intersect, Subtract, Exclude, Distinct 
判定Count, Any, All 
切り出しFirst, FirstOrDefault, Last, LastOrDefault, Single, ElementAt, Take, Skip 
固定化ToList, ToDictionary 
演算Aggregate, Sum, Average, Max, Min 
その他、山ほどのアイテム。 
自分でロジック書くのが馬鹿らしくなる。 
ちなみに、無ければ自分で作ることもできる!
速度は?と言ったら、お前はもう死んでいる 
まず、LINQで書く事。これにより、短時間で実装を完了させられる。 
そして、問題となっているクエリを、測定するなどして確かめる。 
その部分だけ、どうにかする。 
従来式のロジックループに展開する(そこだけ)。 
より高速な集合演算アルゴリズムに置き換える。 
PLINQ(並列LINQ)を使う。「AsParallel()」をかますだけなので、実装は容易。 但し効果的に使うには、どこに適用すべきかの試行錯誤が必要。まぁ、付けたり外したりす るだけだから、リスクは殆どない。 
ロジックで書いてたら、 
こういう手法は端からムリ
Good LINQ! 
お勧めの本です。 通称、赤間本 
LINQの要は拡張メソッドネ。 
某言語はマネ出来るのかしら?

More Related Content

KEY
詳解UNIXプログラミング 第4章 ファイルとディレクトリ
PPTX
Javaプログラミング入門【第9回】
PPTX
PPTX
Linuxのファイルシステムについて調べてみた
PDF
全文検索エンジンMroonga_エンジニア勉強会20140418
PDF
UNIXことはじめ
PDF
後期第六回ネットワークチーム講座資料
PDF
Unixファイルシステムの歴史
詳解UNIXプログラミング 第4章 ファイルとディレクトリ
Javaプログラミング入門【第9回】
Linuxのファイルシステムについて調べてみた
全文検索エンジンMroonga_エンジニア勉強会20140418
UNIXことはじめ
後期第六回ネットワークチーム講座資料
Unixファイルシステムの歴史

Similar to LINQ基本のキ (20)

PDF
LINQソースでGO!
PDF
VS勉強会 .NET Framework 入門
PDF
LINQ in Unity
PDF
Final LINQ Extensions
PPTX
Visual Studio による開発環境・プログラミングの進化
PPTX
LINQ概要
PDF
Linq To Fun
PDF
An Internal of LINQ to Objects
PPTX
C#を始めたばかりの人へのLINQ to Objects
PPTX
LINQ の概要とかもろもろ
PPTX
C# 3.0 以降
PDF
非.NETerに向けたLINQの紹介
PPTX
Linqの速度測ってみた
PPTX
Linqことはじめ
PPTX
C# LINQ入門
PPTX
若気の至りを精算する
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PPTX
20080201
PDF
C#勉強会
PDF
Linq to XXXX(Reactive Extensionsの紹介)
LINQソースでGO!
VS勉強会 .NET Framework 入門
LINQ in Unity
Final LINQ Extensions
Visual Studio による開発環境・プログラミングの進化
LINQ概要
Linq To Fun
An Internal of LINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
LINQ の概要とかもろもろ
C# 3.0 以降
非.NETerに向けたLINQの紹介
Linqの速度測ってみた
Linqことはじめ
C# LINQ入門
若気の至りを精算する
LINQ 概要 + 結構便利な LINQ to XML
20080201
C#勉強会
Linq to XXXX(Reactive Extensionsの紹介)
Ad

More from Kouji Matsui (20)

PDF
パターンでわかる! .NET Coreの非同期処理
PDF
Making archive IL2C #6-55 dotnet600 2018
PDF
Matrix signal controller and BrainPad overview
PDF
Fun with BrainPad
PDF
What's Functional?
PDF
Pitfall for WioLTE
PDF
How to make the calculator
PDF
Write common, run anywhere
PDF
Locality of Reference
PDF
Nespのコード生成
PDF
C#でわかる こわくないMonad
PDF
You will be assimilated. Resistance is futile.
PDF
How to meets Async and Task
PDF
Beachhead implements new opcode on CLR JIT
PDF
Async deepdive before de:code
PDF
Thread affinity and CPS
PDF
Async DeepDive basics
PDF
continuatioN Linking
PDF
真Intermediate languageのキホン
PDF
.NET Coreから概観する.NETのOSSへの取り組み
パターンでわかる! .NET Coreの非同期処理
Making archive IL2C #6-55 dotnet600 2018
Matrix signal controller and BrainPad overview
Fun with BrainPad
What's Functional?
Pitfall for WioLTE
How to make the calculator
Write common, run anywhere
Locality of Reference
Nespのコード生成
C#でわかる こわくないMonad
You will be assimilated. Resistance is futile.
How to meets Async and Task
Beachhead implements new opcode on CLR JIT
Async deepdive before de:code
Thread affinity and CPS
Async DeepDive basics
continuatioN Linking
真Intermediate languageのキホン
.NET Coreから概観する.NETのOSSへの取り組み
Ad

LINQ基本のキ