小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

VB.NETでのソートについて

VB6での配列または構造体配列のソートは、ロジックでルーチンを組む必要がありました。
しかも、構造体配列のソートは、構造体毎に別ルーチンで作るより他なく、汎用性がありませんでした。
しかし、VB.NETでは、ArrayクラスのSortメソッドで汎用的にソートを実現できます。
その汎用的ソートの仕組みですが、これが結構、複雑です。


まず、VB.NETでは数値型や文字列型の変数は、実は、すべてオブジェクトです。
したがって、メソッドを持つことが可能です。
実際、それらは、IComparableインターフェイスを実装したCompareToメソッドを持っています。
CompareToメソッドは、自オブジェクトと引数で指定された他オブジェクトを大小比較してその結果を返します。


一方、ArrayクラスのSortメソッド内部では、CompareクラスのCompareメソッド(CompareToでない)を比較ルーチンとして使用します。
このCompareメソッドは、引数が2つのオブジェクトで、その2つを大小比較してその結果を返します。
オブジェクト2つの大小比較は、片方のオブジェクトが持つCompareToメソッドに、もう片方のオブジェクトを引数にして呼び出すことにより、大小比較を行い、その結果を返します。
したがって、ソートするオブジェクトのCompareToメソッドを独自に実装すれば、任意のソートが可能なのです。


また、Sortメソッドの第2引数に独自のCompareメソッドを持つオブジェクトを指定することも出来ます。
すると、デフォルトのCompareクラスのCompareメソッドと置き換わり、任意のソートが可能なのです。
尚、独自のCompareメソッド内部では、CompareToメソッドを使用する必要はないです。


ということで、上記の様に、オブジェクト配列内を独自にソートするには2通りあります。

  1. Sortメソッドは第1引数のみで、ソートする配列内のオブジェクト達に独自のCompareToメソッドを実装する方法。
  2. Sortメソッドは第2引数に独自のCompareメソッド(ICompareインターフェイス実装)を持つオブジェクトを指定する方法。

詳しくは、以下を熟読してください。

尚、上記は独自な比較ルーチンが必要な場合で、普通に数値順や文字コード順ならSortメソッドの第1引数にオブジェクト配列を指定するだけです。