2019/05/22(水)に開催された Gotanda Unity #12の資料です。
~モンスターリストの中から一番レベルが高いやつ、どうやって見つける?~@RyotaMurohoshi2019/05/22(水) Gotanda.Unity #12ImportedLinqのススメ
View Slide
配列やリストを扱う「ロジック」の話をしますみなさんのUnityプロジェクトにもありますよね?Unityゲーム開発で、よく出てきますね?
こんな感じのMonsterクラスがありますclass Monster{public int Level { get; private set; }/* 略 */}
モンスターのリストがあります。この中から30レベル以上のモンスターの数を数えたいですどんなコードを書けばいいですか?IReadOnlyList monsterList = LoadMonsterList();int targetMonsterCount = ???;
「LINQのCountメソッドを使う」
LINQのCountメソッドを使えば、短いし、読みやすいし、最高!IReadOnlyList monsterList = LoadMonsterList();int targetMonsterCount = monsterList.Count(it => it.Level >= 30);
次のロジック
モンスターのリストがあります。この中から一番高いレベルの値を求めます。どんなコードを書けばいいですか?IReadOnlyList monsterList = LoadMonsterList();int maxMonsterLevel = ???;
「LINQのMaxメソッドを使う」
LINQのMaxメソッドを使えば、短いし、読みやすいし、最高!IReadOnlyList monsterList = LoadMonsterList();int maxLevel = monsterList.Max(it => it.Level);
LINQ、超便利ですよね?
モンスターのリストがあります。この中から「一番レベルの高いモンスター」を探します!どんなコードを書けばいいですか?IReadOnlyList monsterList = LoadMonsterList();Monster maxLevelMonster = ???;
これも「LINQのメソッドを使えば」と、思いきや・・・
実はLINQにこれができるやつ無い!
無いんです!
モンスターリストの中から一番レベルが高いやつ、どうやって見つける?@RyotaMurohoshi2019/05/22(水) Gotanda.Unity #12
自己紹介• @RyotaMurohoshi(Twitter/GitHub)• 趣味ゲーム開発者• UniBook。初回は2014年夏の「LINQのススメ」
おさらい
これができるC#・LINQのメソッドが無い!
モンスターのリストがあります。表示のために、先頭から8個ごとにグループ分けし、リストのリストを作りたいです。どんなコードを書けばいいですか?IReadOnlyList monsterList = LoadMonsterList();var monsterListOfList = ???
これも一発でかけるC#・LINQのメソッドは無い!
モンスターのリストのリストがあります。これを平滑化し、IEnumerableなmonstersを作りたいです。どんなコードを書けばいいですか?List> monsterListOfList = LoadMonsterListOfList();IEnumerable monsters = ???
これは実はLINQを使って一行で書ける
SelectManyを使えば、リストのリストの平滑化は書ける・・・List> monsterListOfList = LoadMonsterListOfList();IEnumerable 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 monsterList = LoadMonsterList();// 型はIReadOnlyCollection// MaxByは一番大きい要素(複数)を探すメソッドvar maxLevelMonsters = monsterList.MaxBy(it => it.Level);
「ImportedLinq」の利用例 : 「Buffer」モンスターのリストを、8個ごとにグループ分けするコード。IReadOnlyList monsterList = LoadMonsterList();// 型はIEnumerable>// Bufferは先頭から指定数ごとにまとめるメソッドvar bufferedMonsters = monsterList.Buffer(8);
「ImportedLinq」の利用例 : 「Flatten」モンスターのリストのリストを平滑化し、IEnumerableを作るコード。List> monsterListOfList = LoadMonsterListOfList();// Flattenは、リストのリストなどをIEnumerableに平滑化するメソッド// 「平滑化するよ」ということがメソッド名から伝わるIEnumerable monsters = monsterListOfList.Flatten();
• モンスターのリストから一番高いレベルのモンスターを探したい• モンスターのリストを先頭からn個ごとにまとめたい• モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたいこういう処理、ゲーム開発でもよく書くじゃないですか?C#・LINQでは一発で書けないけれど、「ImportedLinq」を使えば、一発で書けますよ!
ところで
「ImportedLinq」は「便利なコレクションメソッドの詰め合わせ」ではありません。
他の言語の便利なコレクションメソッドを、C#er・Unity開発者にお届け!他の言語に慣れている人の「C#になんでこのコレクションメソッド無いの」を解決!
あなたの「こんなの欲しかった」ってコレクションメソッドがきっとあります!ぜひゲーム開発で役立ててください!
GitHub/NuGetで公開しました!使ってね!感想待ってます!
続きはブログで!もしくはGitHubで!
よかったら☆をください!https://github.com/RyotaMurohoshi/ImportedLinq