Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Final LINQ Extensions

Final LINQ Extensions

C# LINQの基礎について解説しています。発表自体はかなり前ですが、現在(.NET 5)においても全く問題ありません。

------

Center CLR Part.2 (DoorKeeperは退会したため、募集エントリは残っていません)

Kouji Matsui

February 07, 2015
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

  1. 自己紹介  けきょ (@kekyo2 Kouji Matsui)  LINQ, Async, .NETとか

     Center CLRオーガナイザーです  会社やってます  アーキとかフレームワーク設計とか
  2. ループと分岐処理からの脱却  LINQでは、処理内容を「演算子」と呼ばれるメソッド群を組み合わ せて表現します。 無限数列を生成 乱数を生成 0 0 0 …

    Rand() Rand() Rand() … [r0] [r1] [r2] 乱数の無限数列 それらを配列化 count個だけ 「0」の無限数列 count個だけ … [r(count-1)] 配列
  3. ループと分岐処理からの脱却  LINQは、「数列」に対して、様々な「演算子」を適用して処理を 実現します。 0 0 0 … Rand() Rand()

    Rand() … [r0] [r1] [r2] Distinct (value % 2) == 0  分岐条件をプログラマブルに実行 するのではなく、データの加工条 件を「宣言的」に記述します。 無限数列を Infinite() 変換し Select() 絞り込みを行い Where() 重複を除去し Distinct() 指定された個数だけ取り出し Take() 配列に変換する ToArray() … [r(count-1)]
  4. アジェンダ  ループと分岐処理からの脱却  構造的な値への適用  初歩的な演算子  実践的なforeachの置き換え 

    列挙子とは  演算子を作る  パフォーマンスの改善 Persons Person Address Address Person Address
  5. 初歩的な演算子  とりあえず、以下の使い方を覚えましょう。 機能グループ 演算子 射影(変換) Select SelectMany フィルター Where

    Skip Take Distinct ソート OrderBy / OrderByDescending ThenBy / ThenByDescending 単項(即値) Any / All Max / Min Sum Count 固定化 ToList / ToArray
  6. 初歩的な演算子(射影) 構文 特徴 メソッド構文 全ての演算子を使用することが可能。 ブロック化されたラムダ式を使用することで、複雑な処理を射影やフィルターで実装 可能。 完全な記述が可能な反面、煩雑になりやすい。 クエリ構文 SQLに似た、フレンドリーな構文を使用可能。

    式は暗黙にラムダ式として取り扱われるので、仮引数の宣言が不要で、式の記述がシ ンプルになります。 ブロック化されたラムダ式を使う事は出来ないので、純粋に式として記述する必要が あります。 サポートされる演算子は一部のみ(Select, SelectMany, Where, OrderBy, ThenBy, Join, GroupBy)。また、コンパイラによって固定的に置き換えられる「構文糖」です。 SelectManyのネストした要素の引き渡しを暗黙裡に行えるため、SelectManyについて 非常に簡潔に記述できます。 let(範囲変数)を使用できる。メソッド構文ではいちいち匿名クラスに再代入が必要 だが、letを使うと簡単に値を持ってまわることが出来ます。  メソッド構文とクエリ構文の比較 個人的には、どちらが優れている とは言えないと思います
  7. 列挙子とは  ずっと配列で例を示してきました が、LINQの演算子は「列挙子」で あれば、何でも対応できます。  列挙子とは、「IEnumerable<T>イン ターフェイス」の事です。  このインターフェイスを実装して

    いるクラスに対して、LINQ演算子 を適用することが出来ます。  配列やList<T>クラスも、 IEnumerable<T>インターフェイスを 実装しているので、どちらも同じ 演算子を適用できるのです。
  8. アジェンダ  ループと分岐処理からの脱却  構造的な値への適用  初歩的な演算子  実践的なforeachの置き換え 

    列挙子とは  演算子を作る  パフォーマンスの改善 その昔、クリスタルの魔力をわが手中に せんとする陰謀が、 「これが最後」というタイトルと共に、 幾度となく繰り返された伝説があった…
  9. 次回予告  クエリ構文との連携  演算子の適用回数を減らすこと(クエリ構文のselectは自動的に削減 される)  短縮演算子(WhereしてCountとか、AnyとかAllとか)  複数の連続したWhere条件の合成

     Whereの適用方法の見直し(要素数の演算量の少ない絞り込み)  並列化(AsParallelとTPL・Producer-Consumerモデルによる制限)  制御構文への回帰とタイミング  LINQ→制御構文は簡単だが、逆は難しい  式木の使われ方 残予定だったけど、 続編にするので、 もっとネタ追加