自作クラスの型の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; } } ); } }