PhysApp

趣味と開発関連のメモ置き場です

自作クラスの型のListをソートする【C#】【Unity】

自作クラスの型のListをソートするにはどうやったらいいんだ?となって書いてみたのでメモ。

書き方

ラムダ式で書いたらすんなりできてしまった。こんな感じ。

データ要素はどこかで入れてる想定。

Dataクラスを適当に作ってみたので、この中のidxを使ってソートをするサンプル。

とりあえずソート処理だけ書いてあるのでソート後の処理とかは煮るなり焼くなりご自由に!

using System.Collections.Generic;
using UnityEngine;

public class SortTest : MonoBehaviour {
    // とりあえず適当にDataクラス
    public class Data {
        public int idx;
        public string str;
        public GameObject obj;
    }

    List< Data > dataList = new List< Data >( );

    /// <summary>
    /// ソートする
    /// </summary>
    private void ListSort( ) {
        dataList.Sort( ( x, y ) => x.idx - y.idx );
    }
}

昇順、降順

昇順、降順はそれぞれこんな感じに書く。

昇順

// 昇順
dataList.Sort( ( x, y ) => x.idx - y.idx );

降順

// 降順
dataList.Sort( ( x, y ) => y.idx - x.idx );

ソートしつつ条件一致を末尾へ

ソート対象がなんらかの条件に当てはまっていたら、その要素をソートしつつ末尾に移動させたい時はこのように書く。

下は昇順のサンプル。末尾の中でもちゃんとソートされる。

using System.Collections.Generic;
using UnityEngine;

public class SortTest : MonoBehaviour {

    // とりあえず適当にDataクラス
    public class Data {
        public int idx;
        public string str;
        public GameObject obj;
    }

    List< Data > dataList = new List< Data >( );

    /// <summary>
    /// ソートする
    /// </summary>
    private void ListSort( ) {
        dataList.Sort( ( x, y ) => {
            bool is_hoge_x = false;
            bool is_hoge_y = false;

            // テキストが"hoge"かどうか
            if ( x.str == "hoge" ) {
                is_hoge_x = true;
            }
            if ( y.str == "hoge" ) {
                is_hoge_y = true;
            }

            // どちらかが"hoge"なら後ろへ回す
            if ( is_hoge_x && !is_hoge_y ) {
                return 1;
            } else if ( !is_hoge_x && is_hoge_y ) {
                return -1;
            } else {
                return x.idx - y.idx;
            }
        } );
    }
}