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