Long-Slow-Distance

Programming Notes with Unity

メニュー

[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;
}

スコアの昇順にソートしているが、スコアが同じ場合はさらにレベルの昇順で比較してソートしている。

160423_list_sort_custom

この場合は昇順ソートだが、降順にしたければ戻り値の正負を逆にすればすぐに出来る。
戻り値を(A-B)か(B-A)としてやることで比較用staticメソッドの記述を減らすことも可能だ。

その辺りも自由に出来るのがいいので、地味にこのソート方法は便利である。

参考:
http://smdn.jp/programming/netfx/sorting/1_compositetypes/
http://programmers.high-way.info/cs/list-sort.html

関連記事