Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Linqの魅力 / attractiveness of Linq
Search
Atria
November 02, 2019
Programming
0
230
Linqの魅力 / attractiveness of Linq
2019/11/2(土) kosen-fun勉強会 で発表。
↓Connpass↓
https://kosen-fun.connpass.com/event/150752/
Atria
November 02, 2019
Tweet
Share
More Decks by Atria
See All by Atria
デカいラーメンを旭川に出現させる / Making big large ramen noodles in Asahikawa
atria
0
100
Google I/O 報告LT会 / Building UI with the M3-adaptive-lib
atria
0
430
TwD3の紹介/Introduction to TwD3
atria
0
78
CUI風ポートフォリオを作った/I made a CUI-style portfolio.
atria
0
380
プログラミング言語C#で世界を創る - Create the world with the programming language C#.
atria
0
350
タスク管理を行うSPAを"C#で"作ってみた / I made a task management SPA "in C#".
atria
2
1.2k
FUNCoder オンラインサークル説明用スライド2020
atria
0
390
Blazorをはじめよう!!-Get started with Blazor!
atria
1
910
All C#なモバイル開発. / All C # Mobile Development.
atria
0
480
Other Decks in Programming
See All in Programming
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
200
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
CSC509 Lecture 12
javiergs
PRO
0
160
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.1k
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
230
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
470
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Fireside Chat
paigeccino
34
3k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
4 Signs Your Business is Dying
shpigford
180
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Practical Orchestrator
shlominoach
186
10k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Designing for humans not robots
tammielis
250
25k
Music & Morning Musume
bryan
46
6.2k
Transcript
LINQの魅力 C#を制している者はLINQを制している Speaker:@AtriaSoft 2019/11/2(土) kosen-fun勉強会
About me. @AtriaSoft http://atriasoft.work/ Atria64 • 畑 大地(a.k.a. Atria) •
公立はこだて未来大学B1 • C#/C++を触ってます • 競技プログラミングが趣味 • 最近はXamarin.Androidと Azure Functionsを用いた ALLC#開発にハマっています
LINQへの導入 LINQについて知るために
こういう時どうする? • データ集合が与えられる – 名前と年齢が格納されている • 年齢順に並び替えたデータ集合にしたい • 未成年(20歳以下)は省きたい •
どう実装するのが最適か
C#でのLINQを用いない実装 • for文を回して挿入ソート まがいなことをしてみる • 冗長なコード • 実装が難しい • Dictionaryは楽だから使っ
てます 実例(C#)
冗長、面倒、汚い
LINQの実装
シンプル、便利、きれい
すげぇだろ?
~僕からのメッセージ~ LINQを使いましょう
LINQ(総合言語クエリ)とは • 様々な種類のデータ集合に対して 標準化された方法で データを問い合わせる事を可能にする。 これでは難しい… • データ集合の扱いを超便利にする!! 比較的簡単!
クエリ式と標準クエリ演算子 LINQの記法の話
クエリ式と標準クエリ演算子(1) • クエリ式 – SQLのような “問い合わせ言語風” の文法で記述する。 – あんまりこの文法は見ない •
後述の “標準クエリ演算子” の方がメジャー var hoge = from score in scores where score > 80 orderby score descending select score; やってること(だいたいこんな感じ) • scoresのデータ集合から • Scoreが80以上の • 降順な • Scoreの配列を生成する
クエリ式と標準クエリ演算子(2) • 標準クエリ演算子 – LINQパターンを形成する ”メソッド” – 一般に広く使われる – 今回はこちらの記法で紹介していく
var hoge = score. Where(x => x > 80). OrderByDescending(x => x); やっていることは前の式と一緒。
クエリ式と標準クエリ演算子(3)
ラムダ式 LINQの力を引き出すために
切っては切れないラムダ式(1) • 今まで(値ベースの考え方) – メソッドに値を渡す • ラムダ式(関数型志向の考え方) – 急にメソッド(処理)を渡す C#はマルチパラダイム言語。
様々な考え方が混在する分、初心者にとって複雑。 F#,Haskell, LISP,Scalaなど
• (x => x)のような式のカタチをしている • ここで出てくる “=>” はラムダ宣言演算子と呼ばれる • 例えば
(x => x )であれば – Xには各要素が与えられていて – その各要素xに操作を行う…みたいな • 正直な所説明が難しい • 使っていくうちで慣れていくものだと思う 切っては切れないラムダ式(2)
LINQの代表的な機能 LINQを実際に使うために
昇順、降順ソートOrderBy() • OrderBy()を用いると昇順ソートできる。 • 降順ソートはOrderByDescending()
競プロ御用達Split() • 文字列を解析して分けてくれる • CSVファイルの解析によく使う • 競プロの要素受け取りでよく使う 上のソースコードの動き → int[]
hoge = {1,1331,303};
データ形式を揃えるSelect() • コレクションの値を一括して変換する場面で活躍 • 上の例ではすべての要素をint型にキャストしている • いわゆる”射影”もできる • できること例 –
すべての要素を二倍する – すべての要素をStringに変換する
配列やListに変換 ToList(),ToArray() • 配列やList型に変換できる。便利。 • 基本的にLINQ演算の結果は” IEnumerable型” – ToList()やToArray()などに頼る場面が多い –
IEnumerable<T>には、今回深く触れない
組み合わせた例の実行結果 きれいに記述することができた
条件に合う個数を調べるCount() • データ集合に何個要素が含まれているのかを返す • “条件を満たす要素が何個あるのか”みたいなのも 取れる(後で詳しく) • Java系では ”配列.length” などで取れるやつ
• C++では確か ”sizeof(配列)” • 計算量はO(n)っぽい。 – 速度を必要とする現場(競プロなど)では気をつけること
Conut()を使った図 • 先程より、int[] hoge = {2,1331,303}である • Count()を用いることで要素数を取得している
条件に合うデータにするWhere() • 条件に合う要素を取り出し、新しく作り直す • 計算量はO(n),Count同様,注意すること 偶数のみ取り出すコード
WhereとCount(1) • Countは “条件を満たす要素が何個あるのか” が取れる 偶数のみ取り出したときの個数を返すコード
WhereとCount(2) • なので、 わざわざWhereとCountを組み合わせる必要はない 計算量にも全く変化がなかった(自分調べ)
WhereとCount(3) 冗長なだけで全く意味がない。 このようなコードは書かないようにしよう。
最大,最小,平均,合計 Max(),Min(),Average(),Sum() • 説明不要? • 配列の最大最小平均合計を出してくれます • なかなかに便利です
遅延評価 LINQをより深く理解するために 上級編
ちょっと難しい遅延評価 • 遅延評価は “必要な時に必要な値を参照する”というもの – 値が必要になるまで、値の評価を後回しにするというもの • 突き詰めるとモナドなどにたどり着くらしい。こわい。 • 説明が難しいので素晴らしい記事を紹介しておわります
遅延評価についての素晴らしい記事 • [雑記] LINQ と遅延評価 - C# によるプログラミング入 門 ...
- ++C++ – https://ufcpp.net/study/csharp/sp3_lazylist.html • 【小ネタ】LINQの「遅延評価」「即時評価」って何が違 うの? - Qiita – https://qiita.com/4_mio_11/items/dec20929f189bb2b1a8 e
まとめ LINQってめっちゃいいでしょ
LINQはC#だけのものではなくなった • C#LINQに人々は刺激され、 LINQは様々なプログラミング言語へ広まった • 例 – Python -> pynq
– PHP -> PHPLinq – JavaScript -> jLinq, JSINQ ほか – Go -> go-linq • あなたの主用言語でも使えるかもしれない
Let’s LINQ
LINQの魅力 C#を制している者はLINQを制している Speaker:@AtriaSoft 2019/11/2(土) kosen-fun勉強会