×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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勉強会