ImportedLinqのススメ

 ImportedLinqのススメ

2019/05/22(水)に開催された Gotanda Unity #12の資料です。

F46c97bb74758d481531990654933050?s=128

RyotaMurohoshi

May 22, 2019
Tweet

Transcript

  1. ~モンスターリストの中から一番レベルが高いやつ、どうやって見つける?~ @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12 ImportedLinqのススメ

  2. 配列やリストを扱う「ロジック」の話をします みなさんのUnityプロジェクトにもありますよね? Unityゲーム開発で、よく出てきますね?

  3. こんな感じのMonsterクラスがあります class Monster { public int Level { get; private

    set; } /* 略 */ }
  4. モンスターのリストがあります。 この中から30レベル以上のモンスターの数を数えたいです どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); int targetMonsterCount =

    ???;
  5. 「LINQのCountメソッドを使う」

  6. LINQのCountメソッドを使えば、短いし、読みやすいし、最高! IReadOnlyList<Monster> monsterList = LoadMonsterList(); int targetMonsterCount = monsterList.Count(it =>

    it.Level >= 30);
  7. 次のロジック

  8. モンスターのリストがあります。 この中から一番高いレベルの値を求めます。 どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); int maxMonsterLevel =

    ???;
  9. 「LINQのMaxメソッドを使う」

  10. LINQのMaxメソッドを使えば、短いし、読みやすいし、最高! IReadOnlyList<Monster> monsterList = LoadMonsterList(); int maxLevel = monsterList.Max(it =>

    it.Level);
  11. LINQ、超便利ですよね?

  12. 次のロジック

  13. モンスターのリストがあります。 この中から「一番レベルの高いモンスター」を探します! どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); Monster maxLevelMonster =

    ???;
  14. これも「LINQのメソッドを使えば」 と、思いきや・・・

  15. 実はLINQにこれができるやつ 無い!

  16. 無いんです!

  17. モンスターリストの中から一番レベルが高いやつ、 どうやって見つける? @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12

  18. 自己紹介 • @RyotaMurohoshi(Twitter/GitHub) • 趣味ゲーム開発者 • UniBook。初回は2014年夏の「LINQのススメ」

  19. おさらい

  20. モンスターのリストがあります。 この中から「一番レベルの高いモンスター」を探します! どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); Monster maxLevelMonster =

    ???;
  21. これができるC#・LINQのメソッドが無い!

  22. 次のロジック

  23. モンスターのリストがあります。 表示のために、先頭から8個ごとにグループ分けし、リストのリストを作りたいです。 どんなコードを書けばいいですか? IReadOnlyList<Monster> monsterList = LoadMonsterList(); var monsterListOfList =

    ???
  24. これも一発でかけるC#・LINQのメソッドは無い!

  25. 無いんです!

  26. 次のロジック

  27. モンスターのリストのリストがあります。 これを平滑化し、IEnumerable<Monster>なmonstersを作りたいです。 どんなコードを書けばいいですか? List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); IEnumerable<Monster> monsters =

    ???
  28. これは実はLINQを使って一行で書ける

  29. SelectManyを使えば、リストのリストの平滑化は書ける・・・ List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); IEnumerable<Monster> monsters = monsterListOfList.SelectMany(it =>

    it);
  30. 書けるんだけど、個人的には微妙 SelectManyだと 「平滑化する」ってことが伝わりにくい

  31. • モンスターのリストから一番高いレベルのモンスターを探したい • モンスターのリストを先頭からn個ごとにまとめたい • モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたい こういう処理、 Unityゲーム開発でよくありますよね? C#で、LINQで一発で書けたら、読みやすいし嬉しくないですか?

  32. 実はですね・・・

  33. Javaとか、Kotlinとか、F#とか、Haskellとか、 他のプログラミング言語にはあるんですよ こういうことが一発でできるメソッドが・・・

  34. けれど、C#・LINQには そういうメソッドが無いんです!

  35. 無いんです!

  36. 他の言語のコレクションメソッドと比べて C#・LINQ、ちょっと弱いかも・・・ もっと充実していると嬉しい!充実させたい!

  37. ということで作った!

  38. ImportedLinq

  39. 「ImportedLinq」 「他の言語のコレクションで一般的だけど、C#・LINQにはないメソッド」を、 他のプログラミング言語から輸入(Imported)して、 C#・LINQにフィットするようにしたコレクションメソッドライブラリ

  40. ImportedLinqの利用例を紹介!

  41. 「ImportedLinq」の利用例 : 「MaxBy」 モンスターのリストから、一番高いレベルのモンスターを探すコード。 IReadOnlyList<Monster> monsterList = LoadMonsterList(); // 型はIReadOnlyCollection<Monster>

    // MaxByは一番大きい要素(複数)を探すメソッド var maxLevelMonsters = monsterList.MaxBy(it => it.Level);
  42. 「ImportedLinq」の利用例 : 「Buffer」 モンスターのリストを、8個ごとにグループ分けするコード。 IReadOnlyList<Monster> monsterList = LoadMonsterList(); // 型はIEnumerable<IReadOnlyList<Monster>>

    // Bufferは先頭から指定数ごとにまとめるメソッド var bufferedMonsters = monsterList.Buffer(8);
  43. 「ImportedLinq」の利用例 : 「Flatten」 モンスターのリストのリストを平滑化し、IEnumerable<Monster>を作るコード。 List<List<Monster>> monsterListOfList = LoadMonsterListOfList(); // Flattenは、リストのリストなどをIEnumerable<T>に平滑化するメソッド

    // 「平滑化するよ」ということがメソッド名から伝わる IEnumerable<Monster> monsters = monsterListOfList.Flatten();
  44. • モンスターのリストから一番高いレベルのモンスターを探したい • モンスターのリストを先頭からn個ごとにまとめたい • モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたい こういう処理、ゲーム開発でもよく書くじゃないですか? C#・LINQでは一発で書けないけれど、 「ImportedLinq」を使えば、一発で書けますよ!

  45. ところで

  46. 「ImportedLinq」は 「便利なコレクションメソッドの詰め合わせ」 ではありません。

  47. 「ImportedLinq」 「他の言語のコレクションで一般的だけど、C#・LINQにはないメソッド」を、 他のプログラミング言語から輸入(Imported)して、 C#・LINQにフィットするようにしたコレクションメソッドライブラリ

  48. 他の言語の便利なコレクションメソッドを、C#er・Unity開発者にお届け! 他の言語に慣れている人の「C#になんでこのコレクションメソッド無いの」を解決!

  49. あなたの「こんなの欲しかった」って コレクションメソッドがきっとあります! ぜひゲーム開発で役立ててください!

  50. GitHub/NuGetで公開しました! 使ってね!感想待ってます!

  51. 続きはブログで! もしくは GitHubで!

  52. よかったら☆をください! https://github.com/RyotaMurohoshi/ImportedLinq

  53. ~モンスターリストの中から一番レベルが高いやつ、どうやって見つける?~ @RyotaMurohoshi 2019/05/22(水) Gotanda.Unity #12 ImportedLinqのススメ