Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ImportedLinqのススメ
RyotaMurohoshi
May 22, 2019
Technology
0
950
ImportedLinqのススメ
2019/05/22(水)に開催された Gotanda Unity #12の資料です。
RyotaMurohoshi
May 22, 2019
Tweet
Share
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
260
Odin Validationはいいぞ!
ryotamurohoshi
2
350
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
1.8k
Unityでも、新しいC#
ryotamurohoshi
0
800
Riderはいいぞ!
ryotamurohoshi
1
2.4k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
1.5k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
3
13k
ドキドキライブコーディング2019 #Burikaigi2019
ryotamurohoshi
1
660
シリアライズされる名は。
ryotamurohoshi
0
320
Other Decks in Technology
See All in Technology
BFFとmicroservicesアーキテクチャ
hirac1220
0
110
OSS ことはじめ
hsbt
3
560
アルプの 認証/認可分離戦略と手法
ma2k8
PRO
2
330
OSINT/GEOINT ワークショップ 20220514 古橋資料
furuhashilab
2
310
AWS Control TowerとAWS Organizationsを活用した組織におけるセキュリティ設定
fu3ak1
2
650
Whats new in Android Media?
myolwin00
2
110
數據的多重宇宙 @ LINE Taiwan
line_developers_tw
PRO
0
690
⚡Lightdashを試してみた
k_data_analyst
0
210
[SRE NEXT 2022]ヤプリのSREにおけるセキュリティ強化の取り組みを公開する
mmochi23
1
600
VFX Graphを使って 軽率にAudio Visualizerを作る
drumath2237
0
100
runn is a package/tool for running operations following a scenario. / golang.tokyo #32
k1low
1
220
testing journey / テストが嫌いでIT業界を離れるはずだったのに〜テスト嫌いが現場で品質改善を実施するまでの物語〜
aki_moon
1
370
Featured
See All Featured
Designing Experiences People Love
moore
130
22k
The Invisible Customer
myddelton
110
11k
Building Your Own Lightsaber
phodgson
94
4.6k
Atom: Resistance is Futile
akmur
255
20k
Designing for Performance
lara
596
63k
4 Signs Your Business is Dying
shpigford
169
20k
Fireside Chat
paigeccino
11
1.3k
Rails Girls Zürich Keynote
gr2m
86
12k
Bootstrapping a Software Product
garrettdimon
295
110k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
212
11k
How STYLIGHT went responsive
nonsquared
85
3.9k
The Cult of Friendly URLs
andyhume
68
4.7k
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のススメ