VBで自作のクラスをソートしてみた

ファイル名をソートした時 1.jpg 10.jpg 11.jpg 12.jpg ~略~ 18.jpg 19.jpg 2.jpg 20.jpg のようにソートされてしまったのでちゃんと 1.jpg 2.jpg 3.jpg ~略~ 8.jpg 9.jpg 10.jpg 11.jpg のようにソートされるコードを書いてみました。

  Public Class Product2
    Implements System.IComparable

    Private _fullFileName As String
    'String型のプロパティ
    Public ReadOnly Property fullFileName() As String
      Get
        Return Me._fullFileName
      End Get
    End Property

    Private _fileName As String
    Public ReadOnly Property fileName() As String
      Get
        Return Me._fileName
      End Get
    End Property

    Private _indexNo As Integer
    Public ReadOnly Property indexNo() As String
      Get
        Return Me._indexNo
      End Get
    End Property

    'コンストラクタ
    Public Sub New(ByVal fullFileName As String, ByVal fileName As String, ByVal indexNo As Integer)
      Me._fullFileName = fullFileName
      Me._fileName = fileName
      Me._indexNo = indexNo
    End Sub

    '自分自身がobjより小さいときはマイナスの数、大きいときはプラスの数、
    '同じときは0を返す
    Public Function CompareTo(ByVal obj As Object) As Integer _
        Implements System.IComparable.CompareTo

      'Nothingより大きい
      If obj Is Nothing Then
        Return 1
      End If

      '違う型とは比較できない
      If Not Me.GetType() Is obj.GetType() Then
        Throw New ArgumentException("別の型とは比較できません。", "obj")
      End If

      If Me.fileName = DirectCast(obj, Product2).fileName Then
        Return 0
      End If

      If Me.fileName.Length = DirectCast(obj, Product2).fileName.Length Then
        Dim index As Integer = 0

        While index < Me.fileName.Length And Me.fileName(index) = (DirectCast(obj, Product2).fileName(index))
          index = index + 1
        End While

        Return CInt(Me.fileName(index).ToString) - CInt(DirectCast(obj, Product2).fileName(index).ToString)
      End If

      Return Me.fileName.Length - (DirectCast(obj, Product2).fileName.Length)
    End Function
  End Class

呼び出し側

 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'ArrayListの作成
    Dim al As New System.Collections.ArrayList()
    al.Add(New Product2("C:\aa\bb\3.jpg", "20.jpg", 5))
    al.Add(New Product2("C:\aa\bb\22.jpg", "17.jpg", 5))
    al.Add(New Product2("C:\aa\bb\3.jpg", "2.jpg", 5))
    al.Add(New Product2("C:\aa\bb\1.jpg", "3.jpg", 5))
    al.Add(New Product2("C:\aa\bb\7.jpg", "4.jpg", 5))
    al.Add(New Product2("C:\aa\bb\15.jpg", "19.jpg", 5))
    al.Add(New Product2("C:\aa\bb\11.jpg", "6.jpg", 5))
    al.Add(New Product2("C:\aa\bb\15.jpg", "7.jpg", 5))
    al.Add(New Product2("C:\aa\bb\11.jpg", "12.jpg", 5))
    al.Add(New Product2("C:\aa\bb\1.jpg", "9.jpg", 5))
    al.Add(New Product2("C:\aa\bb\7.jpg", "10.jpg", 5))
    al.Add(New Product2("C:\aa\bb\15.jpg", "13.jpg", 5))
    al.Add(New Product2("C:\aa\bb\1.jpg", "15.jpg", 5))
    al.Add(New Product2("C:\aa\bb\7.jpg", "16.jpg", 5))
    al.Add(New Product2("C:\aa\bb\22.jpg", "5.jpg", 5))
    al.Add(New Product2("C:\aa\bb\22.jpg", "11.jpg", 5))
    al.Add(New Product2("C:\aa\bb\3.jpg", "8.jpg", 5))
    al.Add(New Product2("C:\aa\bb\11.jpg", "18.jpg", 5))
    al.Add(New Product2("C:\aa\bb\11.jpg", "9.jpg", 5))
    al.Add(New Product2("C:\aa\bb\1.jpg", "21.jpg", 5))
    al.Add(New Product2("C:\aa\bb\15.jpg", "1.jpg", 5))
    al.Add(New Product2("C:\aa\bb\7.jpg", "22.jpg", 5))
    al.Add(New Product2("C:\aa\bb\22.jpg", "23.jpg", 5))
    al.Add(New Product2("C:\aa\bb\3.jpg", "14.jpg", 5))

    'はじめの状態を表示
    Console.WriteLine("並び替えなし")
    For Each c As Product2 In al
      Console.WriteLine("fullFileName: {0} / fileName: {1} / indexNo{2}", c.fullFileName, c.fileName, c.indexNo)
    Next

    al.Sort()
    Console.WriteLine("並び替え後")
    For Each c As Product2 In al
      Console.WriteLine("fullFileName: {0} / fileName: {1} / indexNo{2}", c.fullFileName, c.fileName, c.indexNo)
    Next
  End Sub

実行結果

並び替えなし
fullFileName: C:\aa\bb\3.jpg / fileName: 20.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 17.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 2.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 3.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 4.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 19.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 6.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 7.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 12.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 9.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 10.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 13.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 15.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 16.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 5.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 11.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 8.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 18.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 9.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 21.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 1.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 22.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 23.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 14.jpg / indexNo5
並び替え後
fullFileName: C:\aa\bb\15.jpg / fileName: 1.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 2.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 3.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 4.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 5.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 6.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 7.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 8.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 9.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 9.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 10.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 11.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 12.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 13.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 14.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 15.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 16.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 17.jpg / indexNo5
fullFileName: C:\aa\bb\11.jpg / fileName: 18.jpg / indexNo5
fullFileName: C:\aa\bb\15.jpg / fileName: 19.jpg / indexNo5
fullFileName: C:\aa\bb\3.jpg / fileName: 20.jpg / indexNo5
fullFileName: C:\aa\bb\1.jpg / fileName: 21.jpg / indexNo5
fullFileName: C:\aa\bb\7.jpg / fileName: 22.jpg / indexNo5
fullFileName: C:\aa\bb\22.jpg / fileName: 23.jpg / indexNo5