[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
