$30 off During Our Annual Pro Sale. View Details »

ImportedLinqのススメ

 ImportedLinqのススメ

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

RyotaMurohoshi

May 22, 2019
Tweet

More Decks by RyotaMurohoshi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 次のロジック

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. LINQ、超便利ですよね?

    View Slide

  12. 次のロジック

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 無いんです!

    View Slide

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

    View Slide

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

    View Slide

  19. おさらい

    View Slide

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

    View Slide

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

    View Slide

  22. 次のロジック

    View Slide

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

    View Slide

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

    View Slide

  25. 無いんです!

    View Slide

  26. 次のロジック

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. 実はですね・・・

    View Slide

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

    View Slide

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

    View Slide

  35. 無いんです!

    View Slide

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

    View Slide

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

    View Slide

  38. ImportedLinq

    View Slide

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

    View Slide

  40. ImportedLinqの利用例を紹介!

    View Slide

  41. 「ImportedLinq」の利用例 : 「MaxBy」
    モンスターのリストから、一番高いレベルのモンスターを探すコード。
    IReadOnlyList monsterList = LoadMonsterList();
    // 型はIReadOnlyCollection
    // MaxByは一番大きい要素(複数)を探すメソッド
    var maxLevelMonsters = monsterList.MaxBy(it => it.Level);

    View Slide

  42. 「ImportedLinq」の利用例 : 「Buffer」
    モンスターのリストを、8個ごとにグループ分けするコード。
    IReadOnlyList monsterList = LoadMonsterList();
    // 型はIEnumerable>
    // Bufferは先頭から指定数ごとにまとめるメソッド
    var bufferedMonsters = monsterList.Buffer(8);

    View Slide

  43. 「ImportedLinq」の利用例 : 「Flatten」
    モンスターのリストのリストを平滑化し、IEnumerableを作るコード。
    List> monsterListOfList = LoadMonsterListOfList();
    // Flattenは、リストのリストなどをIEnumerableに平滑化するメソッド
    // 「平滑化するよ」ということがメソッド名から伝わる
    IEnumerable monsters = monsterListOfList.Flatten();

    View Slide

  44. • モンスターのリストから一番高いレベルのモンスターを探したい
    • モンスターのリストを先頭からn個ごとにまとめたい
    • モンスターのリストのリストを平滑して、モンスターのシーケンスを作りたい
    こういう処理、ゲーム開発でもよく書くじゃないですか?
    C#・LINQでは一発で書けないけれど、
    「ImportedLinq」を使えば、一発で書けますよ!

    View Slide

  45. ところで

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide