以前のプログラムでは配列 OSM[] osms のソートを
Array.Sort(osms, (a,b) => a.zorder-b.zorder); // zorderで並び替えとしていた。
プログラムの仕様を変更したため、配列の範囲指定が必要になった。マニュアル[2]を見ると、 Sortの引数には IComparer のケースと Comparison のケースがある。一読では、両者の違いが判然としなかった。
少し手の込んだソートを行う場合、よく理解しておく必要があるため、「配列の操作」とはページを分けておく。
Comparison の場合はメソッド指定であり、ラムダ式でもよい。 IComparer はインタフェースであり、その実装を別途指定するということであろう。 Array.Sortメソッドには IComparer の場合には、 配列のソート範囲を指定できるが、Comparison の場合には範囲していができない[2]。
したがって、IComparer を使う。
class ZorderComparer : System.Collections.IComparer { public int Compare(object a, object b) { return ((OSM)a).zorder - ((OSM)b).zorder; } } Array.Sort(osms, 0, tile.ixRecord, new ZorderComparer()); // zorderで並び替え