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
280
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
270
Google I/O 報告LT会 / Building UI with the M3-adaptive-lib
atria
0
690
TwD3の紹介/Introduction to TwD3
atria
0
100
CUI風ポートフォリオを作った/I made a CUI-style portfolio.
atria
0
420
プログラミング言語C#で世界を創る - Create the world with the programming language C#.
atria
0
370
タスク管理を行うSPAを"C#で"作ってみた / I made a task management SPA "in C#".
atria
2
1.3k
FUNCoder オンラインサークル説明用スライド2020
atria
0
530
Blazorをはじめよう!!-Get started with Blazor!
atria
1
990
All C#なモバイル開発. / All C # Mobile Development.
atria
0
540
Other Decks in Programming
See All in Programming
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
290
効率的な開発手段として VRTを活用する
ishkawa
1
170
Android 16KBページサイズ対応をはじめからていねいに
mine2424
0
460
フロントエンドのパフォーマンスチューニング
koukimiura
5
2.1k
階層化自動テストで開発に機動力を
ickx
0
160
PHPカンファレンス関西2025 基調講演
sugimotokei
4
250
Startups on Rails in Past, Present and Future–Irina Nazarova, RailsConf 2025
irinanazarova
0
260
テスト駆動Kaggle
isax1015
1
650
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
170
TypeScriptでDXを上げろ! Hono編
yusukebe
3
780
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
660
PicoRuby on Rails
makicamel
3
140
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Optimizing for Happiness
mojombo
379
70k
Documentation Writing (for coders)
carmenintech
72
4.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Facilitating Awesome Meetings
lara
54
6.5k
Why Our Code Smells
bkeepers
PRO
337
57k
Making Projects Easy
brettharned
116
6.3k
Thoughts on Productivity
jonyablonski
69
4.7k
Being A Developer After 40
akosma
90
590k
Building Applications with DynamoDB
mza
95
6.5k
Embracing the Ebb and Flow
colly
86
4.8k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
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勉強会