FC2ブログ
    04 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 06

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unity+LinqでOrderByを使ってみる。 

    おはようございます。坂内です。

    昨日の雪に続き、今日もちょー寒いじゃないですか。


    さて、今日もUnityxLinqのお話。

    Linqを使ってGroupingをする場合はこんな感じで書くことができます。

    [Test0330.cs]

    using System.Collections.Generic;
    using UnityEngine;
    using System.Linq;

    public class Test0330 : MonoBehaviour
    {
    public class WeaponData {
    public int WpNo;
    public enum WeaponType {
    Sword,
    Blunt,
    Spear,
    }
    public WeaponType weaponType;
    public string WpName;
    public int damage; // 攻撃力
    public float speed; // 攻撃速度

    public WeaponData(int no, WeaponType type, string name, int atkdamage, float atkspeed) {
    WpNo = no;
    weaponType = type;
    WpName = name;
    damage = atkdamage;
    speed = atkspeed;
    }
    }

    void Start()
    {
    List<WeaponData> weapon = new List<WeaponData>
    {
    // 剣
    new WeaponData(0, WeaponData.WeaponType.Sword, "壊れた剣", 5, 2f),
    new WeaponData(1, WeaponData.WeaponType.Sword, "銅の剣", 7, 1.5f),
    new WeaponData(2, WeaponData.WeaponType.Sword, "鉄の剣", 9, 1.7f),
    // 鈍器
    new WeaponData(3, WeaponData.WeaponType.Blunt, "ひび割れたバット", 8, 5f),
    new WeaponData(4, WeaponData.WeaponType.Blunt, "棍棒", 12, 7f),
    new WeaponData(5, WeaponData.WeaponType.Blunt, "鉄のメイス", 8, 3f),
    // 槍
    new WeaponData(6, WeaponData.WeaponType.Spear, "折れた槍", 3, 2.4f),
    new WeaponData(7, WeaponData.WeaponType.Spear, "銅の槍", 5, 2.1f),
    new WeaponData(8, WeaponData.WeaponType.Spear, "鉄の槍", 7, 1.6f),
    };

    // 攻撃速度が2以上の武器を攻撃力が高い順に取り出す
    Debug.Log("-----------------攻撃速度が2以上の武器を攻撃力が高い順--------------------");
    IEnumerable<WeaponData> results2 = weapon
    .Where(x => x.speed >= 2f)
    .OrderByDescending(x => x.damage);
    foreach(WeaponData result in results2) {
    Debug.Log(result.WpName + " 攻撃力:" + result.damage + " 攻撃速度:" + result.speed + "s");
    }

    // 武器種別に攻撃速度の速い順に取り出す
    Debug.Log("-----------------武器種別に攻撃速度の速い順に取り出す--------------------");
    IEnumerable<IGrouping<WeaponData.WeaponType, WeaponData>> results3 = weapon
    .OrderBy(x => x.speed)
    .GroupBy(x => x.weaponType);
    foreach(IGrouping<WeaponData.WeaponType, WeaponData> group in results3) {
    Debug.Log("***" + group.Key + "***");
    foreach(WeaponData result in group) {
    Debug.Log(result.WpName + " 攻撃力:" + result.damage + " 攻撃速度:" + result.speed + "s");
    }
    }
    }
    }



    結果はこちら



    ちゃんと「武器種別に攻撃速度の速い順」で並んでますね。

    GroupByというメソッドを使うことで種類別でまとめることができます。
    SQLのGroupByと一緒ですね。

    特殊なのは、Enumerable<IGrouping<WeaponData.WeaponType, WeaponData>> results3 = weapon.OrderBy(x => x.speed).GroupBy(x => x.weaponType);

    ここ。

    IGroupingというクラスがOrderByをしたときの戻りの型になっており、これが各種類別でまとめた際の1つの塊になっています。
    このIGroupingのValueの方に最小単位のアイテムが格納されているので、以下の形で取り出すことができるといった感じになっているようです。

    foreach(IGrouping<WeaponData.WeaponType, WeaponData> group in results3) {
    Debug.Log("***" + group.Key + "***");
    foreach(WeaponData result in group) {
    Debug.Log(result.WpName + " 攻撃力:" + result.damage + " 攻撃速度:" + result.speed + "s");
    }
    }



    ということで、LinqのGroupByの使い方でした!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/688-f14dcd2c
    この記事にトラックバックする(FC2ブログユーザー)