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
ImportedLinqのススメ
Search
RyotaMurohoshi
May 22, 2019
Technology
0
1.2k
ImportedLinqのススメ
2019/05/22(水)に開催された Gotanda Unity #12の資料です。
RyotaMurohoshi
May 22, 2019
Tweet
Share
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Unityの合同同人誌や合同商業誌を書いてる僕は感想やレビューや評価が欲しい
ryotamurohoshi
0
170
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
520
Odin Validationはいいぞ!
ryotamurohoshi
2
730
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
2.2k
Unityでも、新しいC#
ryotamurohoshi
0
1.1k
Riderはいいぞ!
ryotamurohoshi
1
3k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
2.1k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
4
33k
ドキドキライブコーディング2019 #Burikaigi2019
ryotamurohoshi
1
880
Other Decks in Technology
See All in Technology
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
270
サーバー間 GraphQL と webmock-graphql の話 / server-to-server graphql and webmock-graphql
qsona
2
180
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
210
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
2
2.1k
Python と Snowflake はズッ友だょ!~ Snowflake の Python 関連機能をふりかえる ~
__allllllllez__
1
120
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
230
Kernel MemoryでAzure OpenAI Serviceとお手軽データソース連携
mitsuzono
1
240
私が trocco を推す理由
__allllllllez__
1
210
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
560
Delivering Millions of Messages within seconds @ Duolingo
pelelgrino
0
350
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
1
430
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
180
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
25
5.8k
Visualization
eitanlees
136
14k
A Philosophy of Restraint
colly
197
16k
It's Worth the Effort
3n
180
27k
Facilitating Awesome Meetings
lara
42
5.6k
Building a Scalable Design System with Sketch
lauravandoore
456
32k
Designing for humans not robots
tammielis
248
25k
Building Effective Engineering Teams - LeadDev
addyosmani
28
1.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
244
20k
Agile that works and the tools we love
rasmusluckow
325
20k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Web Components: a chance to create the future
zenorocha
305
41k
Transcript
~モンスターリストの中から一番レベルが高いやつ、どうやって見つける?~ @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12 ImportedLinqのススメ
配列やリストを扱う「ロジック」の話をします みなさんのUnityプロジェクトにもありますよね? Unityゲーム開発で、よく出てきますね?
こんな感じのMonsterクラスがあります class Monster { public int Level { get; private
set; } /* 略 */ }
モンスターのリストがあります。 この中から30レベル以上のモンスターの数を数えたいです どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); int targetMonsterCount =
???;
「LINQのCountメソッドを使う」
LINQのCountメソッドを使えば、短いし、読みやすいし、最高! IReadOnlyList<Monster> monsterList = LoadMonsterList(); int targetMonsterCount = monsterList.Count(it =>
it.Level >= 30);
次のロジック
モンスターのリストがあります。 この中から一番高いレベルの値を求めます。 どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); int maxMonsterLevel =
???;
「LINQのMaxメソッドを使う」
LINQのMaxメソッドを使えば、短いし、読みやすいし、最高! IReadOnlyList<Monster> monsterList = LoadMonsterList(); int maxLevel = monsterList.Max(it =>
it.Level);
LINQ、超便利ですよね?
次のロジック
モンスターのリストがあります。 この中から「一番レベルの高いモンスター」を探します! どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); Monster maxLevelMonster =
???;
これも「LINQのメソッドを使えば」 と、思いきや・・・
実はLINQにこれができるやつ 無い!
無いんです!
モンスターリストの中から一番レベルが高いやつ、 どうやって見つける? @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12
自己紹介 • @RyotaMurohoshi(Twitter/GitHub) • 趣味ゲーム開発者 • UniBook。初回は2014年夏の「LINQのススメ」
おさらい
モンスターのリストがあります。 この中から「一番レベルの高いモンスター」を探します! どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); Monster maxLevelMonster =
???;
これができるC#・LINQのメソッドが無い!
次のロジック
モンスターのリストがあります。 表示のために、先頭から8個ごとにグループ分けし、リストのリストを作りたいです。 どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); var monsterListOfList =
???
これも一発でかけるC#・LINQのメソッドは無い!
無いんです!
次のロジック
モンスターのリストのリストがあります。 これを平滑化し、IEnumerable<Monster>なmonstersを作りたいです。 どんなコードを書けばいいですか? List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); IEnumerable<Monster> monsters =
???
これは実はLINQを使って一行で書ける
SelectManyを使えば、リストのリストの平滑化は書ける・・・ List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); IEnumerable<Monster> monsters = monsterListOfList.SelectMany(it =>
it);
書けるんだけど、個人的には微妙 SelectManyだと 「平滑化する」ってことが伝わりにくい
• モンスターのリストから一番高いレベルのモンスターを探したい • モンスターのリストを先頭からn個ごとにまとめたい • モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたい こういう処理、 Unityゲーム開発でよくありますよね? C#で、LINQで一発で書けたら、読みやすいし嬉しくないですか?
実はですね・・・
Javaとか、Kotlinとか、F#とか、Haskellとか、 他のプログラミング言語にはあるんですよ こういうことが一発でできるメソッドが・・・
けれど、C#・LINQには そういうメソッドが無いんです!
無いんです!
他の言語のコレクションメソッドと比べて C#・LINQ、ちょっと弱いかも・・・ もっと充実していると嬉しい!充実させたい!
ということで作った!
ImportedLinq
「ImportedLinq」 「他の言語のコレクションで一般的だけど、C#・LINQにはないメソッド」を、 他のプログラミング言語から輸入(Imported)して、 C#・LINQにフィットするようにしたコレクションメソッドライブラリ
ImportedLinqの利用例を紹介!
「ImportedLinq」の利用例 : 「MaxBy」 モンスターのリストから、一番高いレベルのモンスターを探すコード。 IReadOnlyList<Monster> monsterList = LoadMonsterList(); // 型はIReadOnlyCollection<Monster>
// MaxByは一番大きい要素(複数)を探すメソッド var maxLevelMonsters = monsterList.MaxBy(it => it.Level);
「ImportedLinq」の利用例 : 「Buffer」 モンスターのリストを、8個ごとにグループ分けするコード。 IReadOnlyList<Monster> monsterList = LoadMonsterList(); // 型はIEnumerable<IReadOnlyList<Monster>>
// Bufferは先頭から指定数ごとにまとめるメソッド var bufferedMonsters = monsterList.Buffer(8);
「ImportedLinq」の利用例 : 「Flatten」 モンスターのリストのリストを平滑化し、IEnumerable<Monster>を作るコード。 List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); // Flattenは、リストのリストなどをIEnumerable<T>に平滑化するメソッド
// 「平滑化するよ」ということがメソッド名から伝わる IEnumerable<Monster> monsters = monsterListOfList.Flatten();
• モンスターのリストから一番高いレベルのモンスターを探したい • モンスターのリストを先頭からn個ごとにまとめたい • モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたい こういう処理、ゲーム開発でもよく書くじゃないですか? C#・LINQでは一発で書けないけれど、 「ImportedLinq」を使えば、一発で書けますよ!
ところで
「ImportedLinq」は 「便利なコレクションメソッドの詰め合わせ」 ではありません。
「ImportedLinq」 「他の言語のコレクションで一般的だけど、C#・LINQにはないメソッド」を、 他のプログラミング言語から輸入(Imported)して、 C#・LINQにフィットするようにしたコレクションメソッドライブラリ
他の言語の便利なコレクションメソッドを、C#er・Unity開発者にお届け! 他の言語に慣れている人の「C#になんでこのコレクションメソッド無いの」を解決!
あなたの「こんなの欲しかった」って コレクションメソッドがきっとあります! ぜひゲーム開発で役立ててください!
GitHub/NuGetで公開しました! 使ってね!感想待ってます!
続きはブログで! もしくは GitHubで!
よかったら☆をください! https://github.com/RyotaMurohoshi/ImportedLinq
~モンスターリストの中から一番レベルが高いやつ、どうやって見つける?~ @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12 ImportedLinqのススメ