vol.21

イマサラ的に…

ToString と CompareTo の使い方

update:2007/04/03


まあ 手馴れた方々はもうとっくにご存知の話です。例えば、どこかから取ってきたデータがオブジェクトに格納されていて、それを画面上に表示したいとか、整列させたいとか。
先日、意外と「どうやってやったの?」と聞かれる機会が多かったので、ちょいとまとめてみました。

とりあえずこんな感じでやって見ます。

確かに、イロイロと「もっとマシなやり方があるだろう」という気はしますが、ここは ToString と CompareTo の使い方が目的なので。
で、一番最初の状態のクラスのソースは、こんな感じです。(緑色になっているのは、スニペット依存フィールド)

 

1.まずはなにも考えずにListBoxに追加

何も考えずにListBoxにAddしていきました。すると…

…だめじゃん。クラス名だしてどうすんのよ…。

2.ShopNameを出そう

表示したいのは、ShopName。これを出力させるには、ToStringを実装してしまえばよいのです。そう難しく考えることはありません。

Public Overrides Function ToString() As String
    Return mstrShopName
End Function

これで実行すると…


出るには出ましたが、何がどれだか、さっぱりわかりません。IDも出してみましょう。
 

Public Overrides Function ToString() As String
    Return mstrShopName & vbTab & "[" & mintShopID & "]"
End Function




これなら区別が付きます。
なお、ListBoxなのでvbTabが効きましたが、Comboとかだと使えないこともあるので、そこは相手を見ながら考えましょう。

 

3.整列させよう

さて、上の例では、たまたまキレイにID順に並んでいますが、例えばこうなる事だってあるんです。



ま、普通にID順に並べたくなるものです。
だから、安直にArrayに突っ込んでArray.Sortで…



どっかーん。世の中そう甘くはありません。
Array.Sortを使うには、IComparable が実装されている必要があるのです。(see MSDN http://msdn2.microsoft.com/ja-jp/library/6tf1f0bc(VS.80).aspx )

で、実装すると、こんな感じになります。

Public Class Shop
 Implements System.IComparable

'----<---切り取り線--->-----

 Public Function CompareTo(ByVal objTarget As Object) As Integer Implements System.IComparable.CompareTo
  If TypeName(objTarget) <> TypeName(Me) Then
    Throw New ArgumentException("引数が違うぞ")
  End If

  Dim objOtherShop As Shop = CType(objTarget, Shop)
  Return mintShopID.CompareTo(objOtherShop.ShopID)

 End Function
End Class

CompareTo の細かい仕様はMSDN- http://msdn2.microsoft.com/ja-jp/library/system.icomparable.compareto(VS.80).aspx#Mtps_DropDownFilterText をご覧ください。
ここでのポイントは、最初に型判定するところと、mintShopID [integer] のCompareTo の結果をそのまま返却するところです。
型判定は、おかしな、訳の解らないものと比較されても困るから。
メンバ変数のCompareToの結果を返却するのは、「それで比較するんだよ」ということで、有りモノを使ったほうがラクだから。

もし、独自のソート順を作りたいなら、自分でゴシゴシと記述する必要があるわけで、実際面倒くさいです(Perlの Space Ship Operator が欲しい…)。

で、コレを実装した結果…

ソートされました、めでたしめでたし。

 

これにて、一件落着。

 

戻る

トップに戻る