整数型に対する Compare の実装

東方算程譚より.

int[] target = { 4, 5, 3, 1, 2 };
Array.Sort(target, 
        delegate (int x, int y) { return record[x] - record[y];});

んー,この場合だと動きますが,オーバーフローやアンダーフローが微妙にやばそげな.
.NET のクラスライブラリで,比較述語というと,

  • this > that なら正値を
  • this == that なら 0 を
  • this < that なら負値

を返すのが基本です.この判定ですが,場合によっては,整数引き算で代用することもできるでしょう.が,Integer Overflow 絡みのセキュリティーホールが世をにぎわす昨今,個人的には System.Collections.Generic.Comparer がおすすめです.昔は 3 項演算子で毎回比較処理を書いてたんですが,楽になったものですな.

Array.Sort(target, 
        delegate (int x, int y) { return Comparer<int>.Default.Compare(record[x], record[y]);});

手元のソースは .NET 2.0 が出たときにあらかた書き換えたんですが,古いところだと結構残ってるかも.



あー,@IT .NET Tips,『自作クラスによる配列をソート(並べ替え)するには?』あたりも引き算か.まあこの例も Length プロパティなので動きはしますが,注意した方が良い部分ではありますね.


追記
インライン展開を期待するなら,以下のように書く方が良いでしょう.

Array.Sort(target, 
        delegate (int x, int y) { return record[x].CompareTo(record[y]) ;});