DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ArrayListのSortメソッドでソートされない

環境/言語:[WindowsXP SP2/VB2005/.Net2.0]
分類:[.NET]

VisualBasic2005で開発をしています。

ArrayListのSortメソッドで、インターフェイスIComparerのCompareメソッドを実装したクラスを引き渡して、並び替えをしたいと考えています。

しかし、ArrayListの要素が2個の場合に正しく並び変わらない現象が出て困っています。
3個以上の要素の場合は、正しく並び変わります。
なにか足りないことがあるのでしょうか。
よろしくお願いいたします。

(ソース)
<ソート実行側>
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim MyArray As New ArrayList

MyArray.Add(10)
MyArray.Add(9)
'MyArray.Add(8) 'これがあると正しく処理できる。

Dim Comp As New MyCompare
MyArray.Sort(Comp)

End Sub
End Class

<IComparer実装>
Public Class MyCompare
Implements IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare

Dim x_ As Integer = CType(x, Integer)
Dim y_ As Integer = CType(y, Integer)
'// ここで比較要素が2つの場合、x_・y_とも同じ値となってしまう
'// x_が10、y_も10

'// 比較ロジック...

End Function
End Class
ご質問を確認させてください。

要素が2つの時は、Compareメソッドが一回しか呼び出されずに、xとyが10になるということでしょうか?それとも、複数呼び出され、10と9の比較も行われるが、並び替えは行われないということでしょうか?
すみません。私が、IComparerの実装内の動作をよく理解できていなかったようです。
管理人様のご確認により、はっと目が覚めました。
IComparerの実装で、xとyにはArrayListに格納されている順番に値が入ってくる、と思い込んで
他の処理を誤って書いていたのが、原因だったようです。

比較のロジックをデバッグしている際に、
要素が3つの時にx=10,y=9のように入ってきているのを見て、勘違いをしてしましました。
(掲載させていただいたのは説明の為のサンプルで、実際に作成しているのは複数のキーを比較して大小を決める、というものでした)
ずっとIComparerの実装の1行目にブレークポイントを設定して、そこで4時間以上思考が停止していました。

結局、Compareメソッドの引数xとyがどんな順番で値を返すのかはよくわからないままなのですが、(あまり意識するする必要はないんでしょうけど)
全ての要素をきちんと比較してくれています。

よって、比較ロジックをきちんと修正することにより、ただしく並び変わるようになりました。
お騒がせしまして、大変申し訳ありません。
以後、処理を一通りきちんと見ていくようにしたいと思います。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板