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
320
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
What's new in Firebase / Google I/O 2025 報告LT会
atria
0
330
デカいラーメンを旭川に出現させる / Making big large ramen noodles in Asahikawa
atria
0
380
Google I/O 報告LT会 / Building UI with the M3-adaptive-lib
atria
0
830
TwD3の紹介/Introduction to TwD3
atria
0
120
CUI風ポートフォリオを作った/I made a CUI-style portfolio.
atria
0
460
プログラミング言語C#で世界を創る - Create the world with the programming language C#.
atria
0
390
タスク管理を行うSPAを"C#で"作ってみた / I made a task management SPA "in C#".
atria
2
1.4k
FUNCoder オンラインサークル説明用スライド2020
atria
0
570
Blazorをはじめよう!!-Get started with Blazor!
atria
1
1k
Other Decks in Programming
See All in Programming
SourceGeneratorのススメ
htkym
0
200
Grafana:建立系統全知視角的捷徑
blueswen
0
330
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
290
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
320
CSC307 Lecture 06
javiergs
PRO
0
690
CSC307 Lecture 03
javiergs
PRO
1
490
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
200
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
CSC307 Lecture 09
javiergs
PRO
1
840
CSC307 Lecture 01
javiergs
PRO
0
690
2026年 エンジニアリング自己学習法
yumechi
0
140
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
98
The World Runs on Bad Software
bkeepers
PRO
72
12k
Automating Front-end Workflow
addyosmani
1371
200k
A Tale of Four Properties
chriscoyier
162
24k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
120
First, design no harm
axbom
PRO
2
1.1k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
HDC tutorial
michielstock
1
390
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
WENDY [Excerpt]
tessaabrams
9
36k
Designing Experiences People Love
moore
144
24k
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勉強会