ホームに戻る
関連 :
目次 :
コレクションのソート
固定長配列を含むコレクションにソート関数を適用することで、要素を並べ替えることができる。
特に指定が無ければ昇順で並べられる。
固定長配列(Array)
Array.Sort() を用いる。
// 配列の宣言・初期化
int[] arrSample = {3, 5, 2, 1, 4};
// 配列のソート( Array.Sort() )
Array.Sort(arrSample); //< { 3, 5, 2, 1, 4 } ⇒ { 1, 2, 3, 4, 5 }
List
// 配列の宣言・初期化
List<int> listSample =
new List<int> {3, 5, 2, 1, 4};
// Listのソート( Sort() )
listSample.Sort(); //< { 3, 5, 2, 1, 4 } ⇒ { 1, 2, 3, 4, 5 }
構造を持つデータのソート
数値や文字列と異なり、クラスや構造体、タプルの場合は値を単純に比較できないので、
比較基準を関数として規定し、Sort() 関数に渡す必要がある。
比較関数は同型の引数二つをとり、両者の序列(昇順)を戻り値として返す。
序列 | 戻り値 |
引数1が引数2よりも前 (引数1 < 引数2) | 負 |
引数1と引数2が同等 | 0 |
引数1が引数2よりも後 (引数1 > 引数2) | 正 |
private void Hoge()
{
// string, DateTime, DateTime のタプル
List<(string reason, DateTime begin, DateTime end)> sorted =
new List<(string reason, DateTime begin, DateTime end)>();
foreach (var item in plans)
{
sorted.Add(item.cb_Reason.Text, item.dtp_Begin.Value.Date, item.dtp_End.Value.Date);
}
// 比較関数を渡してソート
sorted.Sort(Compare);
:
}
// コレクションソート用比較関数
private int Compare((string reason, DateTime begin, DateTime end) row1,
(string reason, DateTime begin, DateTime end) row2)
{
// reason を比較に用いる
// 空文字列であれば序列が後
var r1r = row1.reason;
var r2r = row2.reason;
if (r1r == "" && r2r == "") { return 0; }
if (r1r == "") { return 1; }
if (r2r == "") { return -1; }
:
}