[C#] Listを比較用メソッドでソートする
Listを自前の比較用メソッドを使用してソートする方法。
複数の条件があったり、ソート条件を細かく指定したい場合に有用。
簡単なので以下サンプル。
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class HogeScore { public int _lv; // レベル public int _score; // スコア // ソート用の比較メソッド public static int Compare( HogeScore dataA, HogeScore dataB ) { if( dataA._score > dataB._score ){ return 1; // AがBより後になる }else if( dataA._score < dataB._score ){ return -1; // AがBより前になる }else{ // スコアが同じ場合はレベルで比較する return CompareLv( dataA, dataB ); } } // レベルで比較する用 public static int CompareLv( HogeScore dataA, HogeScore dataB ) { if( dataA._lv > dataB._lv ){ return 1; }else if( dataA._lv < dataB._lv ){ return -1; }else{ return 0; } } } public class ListSort : MonoBehaviour { // Awake void Awake() { m_SortedScoreList = new List<HogeScore>( m_ScoreList ); // 比較用メソッドを用いてソート(昇順) m_SortedScoreList.Sort( HogeScore.Compare ); } // member public List<HogeScore> m_ScoreList = new List<HogeScore>(); public List<HogeScore> m_SortedScoreList; }
スコアの昇順にソートしているが、スコアが同じ場合はさらにレベルの昇順で比較してソートしている。
この場合は昇順ソートだが、降順にしたければ戻り値の正負を逆にすればすぐに出来る。
戻り値を(A-B)か(B-A)としてやることで比較用staticメソッドの記述を減らすことも可能だ。
その辺りも自由に出来るのがいいので、地味にこのソート方法は便利である。
参考:
http://smdn.jp/programming/netfx/sorting/1_compositetypes/
http://programmers.high-way.info/cs/list-sort.html