Slide 1

Slide 1 text

LINQの魅力 C#を制している者はLINQを制している Speaker:@AtriaSoft 2019/11/2(土) kosen-fun勉強会

Slide 2

Slide 2 text

About me. @AtriaSoft http://atriasoft.work/ Atria64 • 畑 大地(a.k.a. Atria) • 公立はこだて未来大学B1 • C#/C++を触ってます • 競技プログラミングが趣味 • 最近はXamarin.Androidと Azure Functionsを用いた ALLC#開発にハマっています

Slide 3

Slide 3 text

LINQへの導入 LINQについて知るために

Slide 4

Slide 4 text

こういう時どうする? • データ集合が与えられる – 名前と年齢が格納されている • 年齢順に並び替えたデータ集合にしたい • 未成年(20歳以下)は省きたい • どう実装するのが最適か

Slide 5

Slide 5 text

C#でのLINQを用いない実装 • for文を回して挿入ソート まがいなことをしてみる • 冗長なコード • 実装が難しい • Dictionaryは楽だから使っ てます 実例(C#)

Slide 6

Slide 6 text

冗長、面倒、汚い

Slide 7

Slide 7 text

LINQの実装

Slide 8

Slide 8 text

シンプル、便利、きれい

Slide 9

Slide 9 text

すげぇだろ?

Slide 10

Slide 10 text

~僕からのメッセージ~ LINQを使いましょう

Slide 11

Slide 11 text

LINQ(総合言語クエリ)とは • 様々な種類のデータ集合に対して 標準化された方法で データを問い合わせる事を可能にする。 これでは難しい… • データ集合の扱いを超便利にする!! 比較的簡単!

Slide 12

Slide 12 text

クエリ式と標準クエリ演算子 LINQの記法の話

Slide 13

Slide 13 text

クエリ式と標準クエリ演算子(1) • クエリ式 – SQLのような “問い合わせ言語風” の文法で記述する。 – あんまりこの文法は見ない • 後述の “標準クエリ演算子” の方がメジャー var hoge = from score in scores where score > 80 orderby score descending select score; やってること(だいたいこんな感じ) • scoresのデータ集合から • Scoreが80以上の • 降順な • Scoreの配列を生成する

Slide 14

Slide 14 text

クエリ式と標準クエリ演算子(2) • 標準クエリ演算子 – LINQパターンを形成する ”メソッド” – 一般に広く使われる – 今回はこちらの記法で紹介していく var hoge = score. Where(x => x > 80). OrderByDescending(x => x); やっていることは前の式と一緒。

Slide 15

Slide 15 text

クエリ式と標準クエリ演算子(3)

Slide 16

Slide 16 text

ラムダ式 LINQの力を引き出すために

Slide 17

Slide 17 text

切っては切れないラムダ式(1) • 今まで(値ベースの考え方) – メソッドに値を渡す • ラムダ式(関数型志向の考え方) – 急にメソッド(処理)を渡す C#はマルチパラダイム言語。 様々な考え方が混在する分、初心者にとって複雑。 F#,Haskell, LISP,Scalaなど

Slide 18

Slide 18 text

• (x => x)のような式のカタチをしている • ここで出てくる “=>” はラムダ宣言演算子と呼ばれる • 例えば (x => x )であれば – Xには各要素が与えられていて – その各要素xに操作を行う…みたいな • 正直な所説明が難しい • 使っていくうちで慣れていくものだと思う 切っては切れないラムダ式(2)

Slide 19

Slide 19 text

LINQの代表的な機能 LINQを実際に使うために

Slide 20

Slide 20 text

昇順、降順ソートOrderBy() • OrderBy()を用いると昇順ソートできる。 • 降順ソートはOrderByDescending()

Slide 21

Slide 21 text

競プロ御用達Split() • 文字列を解析して分けてくれる • CSVファイルの解析によく使う • 競プロの要素受け取りでよく使う 上のソースコードの動き → int[] hoge = {1,1331,303};

Slide 22

Slide 22 text

データ形式を揃えるSelect() • コレクションの値を一括して変換する場面で活躍 • 上の例ではすべての要素をint型にキャストしている • いわゆる”射影”もできる • できること例 – すべての要素を二倍する – すべての要素をStringに変換する

Slide 23

Slide 23 text

配列やListに変換 ToList(),ToArray() • 配列やList型に変換できる。便利。 • 基本的にLINQ演算の結果は” IEnumerable型” – ToList()やToArray()などに頼る場面が多い – IEnumerableには、今回深く触れない

Slide 24

Slide 24 text

組み合わせた例の実行結果 きれいに記述することができた

Slide 25

Slide 25 text

条件に合う個数を調べるCount() • データ集合に何個要素が含まれているのかを返す • “条件を満たす要素が何個あるのか”みたいなのも 取れる(後で詳しく) • Java系では ”配列.length” などで取れるやつ • C++では確か ”sizeof(配列)” • 計算量はO(n)っぽい。 – 速度を必要とする現場(競プロなど)では気をつけること

Slide 26

Slide 26 text

Conut()を使った図 • 先程より、int[] hoge = {2,1331,303}である • Count()を用いることで要素数を取得している

Slide 27

Slide 27 text

条件に合うデータにするWhere() • 条件に合う要素を取り出し、新しく作り直す • 計算量はO(n),Count同様,注意すること 偶数のみ取り出すコード

Slide 28

Slide 28 text

WhereとCount(1) • Countは “条件を満たす要素が何個あるのか” が取れる 偶数のみ取り出したときの個数を返すコード

Slide 29

Slide 29 text

WhereとCount(2) • なので、 わざわざWhereとCountを組み合わせる必要はない 計算量にも全く変化がなかった(自分調べ)

Slide 30

Slide 30 text

WhereとCount(3) 冗長なだけで全く意味がない。 このようなコードは書かないようにしよう。

Slide 31

Slide 31 text

最大,最小,平均,合計 Max(),Min(),Average(),Sum() • 説明不要? • 配列の最大最小平均合計を出してくれます • なかなかに便利です

Slide 32

Slide 32 text

遅延評価 LINQをより深く理解するために 上級編

Slide 33

Slide 33 text

ちょっと難しい遅延評価 • 遅延評価は “必要な時に必要な値を参照する”というもの – 値が必要になるまで、値の評価を後回しにするというもの • 突き詰めるとモナドなどにたどり着くらしい。こわい。 • 説明が難しいので素晴らしい記事を紹介しておわります

Slide 34

Slide 34 text

遅延評価についての素晴らしい記事 • [雑記] LINQ と遅延評価 - C# によるプログラミング入 門 ... - ++C++ – https://ufcpp.net/study/csharp/sp3_lazylist.html • 【小ネタ】LINQの「遅延評価」「即時評価」って何が違 うの? - Qiita – https://qiita.com/4_mio_11/items/dec20929f189bb2b1a8 e

Slide 35

Slide 35 text

まとめ LINQってめっちゃいいでしょ

Slide 36

Slide 36 text

LINQはC#だけのものではなくなった • C#LINQに人々は刺激され、 LINQは様々なプログラミング言語へ広まった • 例 – Python -> pynq – PHP -> PHPLinq – JavaScript -> jLinq, JSINQ ほか – Go -> go-linq • あなたの主用言語でも使えるかもしれない

Slide 37

Slide 37 text

Let’s LINQ

Slide 38

Slide 38 text

LINQの魅力 C#を制している者はLINQを制している Speaker:@AtriaSoft 2019/11/2(土) kosen-fun勉強会