配列でソートするって手動でやるとかなりめんどくさいですが、.Net には Sort() メソッドが追加されており、簡単にソートができるようです。
数値型や文字列型の基本クラスを使った配列には何もしなくても、Array.Sort(配列名) でソートできます。
ただ、並び替えのルールを自分で定義したい時もありますよね。
IComparer インターフェイスの Compare メソッドを実装したメソッドを作り、Array.Sort の引数に渡してやればいいそうです。
ということで、あるフォルダのファイル名を文字列として取得しソートするコード書いてみました。
このファイルには拡張子の前に2桁の数値があり、この数値の昇順でソートするという要件です。
コードは下記のようになります。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'任意のフォルダのファイル名取得
Dim fileArray As String() = IO.Directory.GetFiles("c:\test")
'ソート前の配列出力
Console.WriteLine("ソート前")
For Each file As String In fileArray
Console.WriteLine(file)
Next
'ソートに使う比較クラスインスタンス生成
Dim fileNameComp As IComparer = New FileNameComp()
'ソート
Array.Sort(fileArray, fileNameComp)
'ソート後の配列出力
Console.WriteLine("ソート後")
For Each file As String In fileArray
Console.WriteLine(file)
Next
End Sub
'''
''' ソートの際比較するための IComparer を実装したクラス
'''
'''
Public Class FileNameComp
Implements IComparer
'''
''' ソートの際比較に使う IComparer.Compare を実装したメソッド。
''' ファイル名の末尾2ケタの数値の大小で比較する。
'''
''' 比較オブジェクト
''' 比較オブジェクト
'''
''' 0より小さい値: x が y より小さい
''' 0 : x と y は等しい
''' 0より大きい値: x が y より大きい値
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim str1 As String = CType(x, String)
Dim str2 As String = CType(y, String)
str1 = str1.Substring(str1.Length - 6, 2)
str2 = str2.Substring(str2.Length - 6, 2)
Dim int1 As Integer
Dim int2 As Integer
If Not Integer.TryParse(str1, int1) Then
'xがキャストできないときはxのほうが大きいとする
Return 1
End If
If Not Integer.TryParse(str2, int2) Then
'yがキャストできないときはyのほうが大きいとする
Return -1
End If
Return int1 - int2
End Function
End Class
End Class
結果は下記の通りです。
ソート前
c:\test\aa_03.txt
c:\test\dd_11.txt
c:\test\Test_01.txt
c:\test\Test_02.txt
c:\test\Test_10.txt
c:\test\Test_99.txt
c:\test\んん_00.txt
ソート後
c:\test\んん_00.txt
c:\test\Test_01.txt
c:\test\Test_02.txt
c:\test\aa_03.txt
c:\test\Test_10.txt
c:\test\dd_11.txt
c:\test\Test_99.txt
ちゃんと指定された条件で、ソートされてますね。
参考: