Linq Hands-on
- 2. 自己紹介
名前: 並木 一真
所属: 株式会社コンシスト
仕事: 自社パッケージ製品(不動産スケルトンパッケージ)開発
趣味: ゲーム、アニメ、ボルダリング
- 3. ハンズオンの流れ
今日の目標 ・・・3分
導入 ・・・30分
LINQ概要 ・・・20分
さっそく書いてみる(ハンズオンの中心) ・・・10分 + 20分
LINQのコツ&注意点 ・・・15分
まとめ&余談 ・・・5分
- 12. LINQ概要
事前に覚えておくこと ~その1~
IEnumerable <T>/IEnumerable(Of T)
先頭から順番に値を取り出す IEnumerator を取得できるインタフェース
Array、List、String などが実装している
foreach できて LINQが使える
<<interface>>
IEnumerable
<<interface>>
IEnumerator
GetEnumerator()
List Array String
実装
?
- 14. LINQ概要
事前に覚えておくこと ~その2~
ラムダ式
LINQのメソッド構文の引数はFunc<T, TResult> Delegate
多くがリスト内のデータ1個を受け取って、真偽か値を返す。
C#の場合
引数 => 式
VB.NETの場合
Function(引数) 式
詳しく覚えなくても、
ハンズオンでLINQのメソッドと組み合わせで覚えればOK
?
- 23. ハンズオン
Q3 Order By で並び替え(解説)
66 48 70 3 100 22 92 11
OrderBy() 入力値 ラムダ式
3 11 22 48 66 70 92 100
- 29. メソッド式の強み
Select() でカウンターを取得できる。 ※Q7 演習問題4
先頭は除くみたいなことが可能。クエリ式だとできない(と思う)
IEnumerable に対して直接実行できるメソッドが多い。そのまま連結できる。
メソッド 簡単解説
ToList() LINQの結果をListにする。超使う。(理由は後述)
ToDictionary() LINQの結果からDictionaryを作る。結構使う。
Distinct() 重複を除く。ToDictionary()と合わせて使う。
が、匿名型のKey指定や、GetHashCode実装等のコツが必要。
Any() 1件以上あればTrueを返す。
FirstOrDefault() 最初の要素を取得する。
Concat() 二つの配列を連結して処理する。
- 31. LINQのコツ
条件がいくつも存在する場合は Where を分ける
Where の中で複雑なAnd条件を書くと読みにくくなるので注意
forとifが出てきたらLINQの出番かも?
LINQを使ってインデントを含めないことでバグを無くす。
データ整理と目的の処理を分ける。
for文、if文だと混在しがちな責任を分離することで、メンテナンスしやすくする。
- 32. LINQの注意点
LINQの戻り値は IEnumerable<T>
これは、LINQを実行した結果ではなくて、実行する予定のクエリである。
Where や Select などのLINQ処理が利用される度に実行される。
LINQの結果を Count() した後に for each でループする使い方をするとパフォーマンスを
落とすので要注意。(事前に ToList() でリストにしてしまう)
IEnumerable<T> をpublicの戻りの型として使用しない方がいい。
詳しくない人はLINQだと分からずに使う。上記のパフォーマンス低下が簡単に起こる。
LINQは狭い範囲の利用に留めよう。
コメントを残す
LINQわからない人は読めない。
敵を作らないために、どんなデータを取り出しているのかコメントを残す。
逆に、コメントがあれば読めちゃうLINQ
- 34. 余談(中級・上級)
慣れてきたら幅が広がるLINQ
Select + 匿名型 = インデックス付き foreach
foreachなのに何番目かが取得できる。
JOIN
2つのデータ集合をJOINして処理することが出来る。
例、DBのアクセス結果をCSVのデータと結合して処理
ToDictionary()、ToHashSet()
キャッシュを作るのに便利。
拡張メソッドとYieldで自作LINQメソッド
自分でLINQメソッド構文を作れます。(注意点2つ目の回避策にもなる)
非同期PLINQ
高負荷演算など非同期で動かすと、ある程度高速になる。